我想知道如何在一定時間後取消某個功能!如何在一段時間後取消某個功能?
例如,我該如何取消這個功能?
private async Task function()
{
try
{
while (true)
{
//mycode
}
}
catch{ }
}
我想知道如何在一定時間後取消某個功能!如何在一段時間後取消某個功能?
例如,我該如何取消這個功能?
private async Task function()
{
try
{
while (true)
{
//mycode
}
}
catch{ }
}
你可以使用Timer類,啓動它,當你想讓它(節目的開始大概),並使用一些像一個簡單的if語句來阻止它,如*如果定時器高於設定更大時間,結束節目。 *
前段時間我面臨同樣的問題,發現一個很好的解決方案爲我工作。我通過這種方式通過wcf將異步調用分離到另一個服務(請參閱下面的代碼):
您可以將CancellationToken與第二個任務組合使用,與您的運行任務並行運行
private const int TimeOut = 50000;
public static async Task<T> HandleServiceCall<T>(Func<Task<T>> doServiceCall, CancellationTokenSource source) where T : class
{
var delaySource = new CancellationTokenSource(TimeSpan.FromSeconds(50));
source.Token.ThrowIfCancellationRequested();
var res = doServiceCall();
if (await Task.WhenAny(res, Task.Delay(TimeSpan.FromMilliseconds(TimeOut), delaySource.Token)) == res)
{
delaySource.Cancel();
await res;
}
else
{
source.Cancel();
throw new Exception("Your Text");
}
return await res;
}
您可以調用此方法例如這樣:
var source = new CancellationTokenSource(TimeSpan.FromSeconds(50));
source.Token.ThrowIfCancellationRequested();
MyWrapperClass.HandleServiceCall(async() => await MyAsyncMethod(source.Token), source).Result
爲了澄清這到底是怎麼做:如果需要取消它 我創建一個取消標記爲我的任務與給定最大TimeSpan然後將此令牌賦予應該調用的異步方法。 這個調用是作爲一個func給我的HandleServiceCall方法。 此方法將創建另一個具有給定較大時間跨度的CancellationToken,該時間跨度將作爲延遲任務運行(task.Delay將等待,直到令牌被觸發)。 Task.WhenAny將查看正常異步任務或延遲任務是否先完成。如果是延遲的,那麼您的最大時間已經過期並引發異常。
問候 康斯坦丁
我添加小例子
static CancellationTokenSource cts;
static void Main(string[] args)
{
cts = new CancellationTokenSource();
Task.Factory.StartNew(test);
cts.Cancel();
}
private async static void test()
{
await function(cts.Token);
}
static async Task function(CancellationToken ct)
{
try
{
while (!ct.IsCancellationRequested)
{
Thread.Sleep(1000);
//mycode
}
}
catch { }
}
我怎麼能取消這個功能呢?
通常情況下,awaitable方法將採取CancellationToken
,所以你只是把它傳遞通過:
private async Task functionAsync(CancellationToken cancellationToken)
{
while (true)
{
await Task.Delay(TimeSpan.FromSeconds(1), cancellationToken); //mycode
}
}
您已經標記了用'CancellationTokenSource'的問題 - 所以傳遞的CancellationToken進入功能,並在循環的每次迭代中檢查它是否已被請求取消,即'while(!cancellationToken.IsCancellationRequested){...' – stuartd