[英]Self continuing Task using ContinueWith
我有一項需要定期運行的任務。 我的第一個實現是:
public static void CheckTask(CancellationTokenSource tokenSource)
{
do
{
// Do some processing
Console.WriteLine("Processing");
// Sleep awhile and wait for cancellation
// If not cancelled, repeat
} while (!tokenSource.Token.WaitHandle.WaitOne(1500));
Console.WriteLine("Bye bye");
}
該任務開始如下:
CancellationTokenSource tokenSource = new CancellationTokenSource();
Task task = null;
task = new Task((x)=> {
CheckTask(tokenSource);
//CheckTask2(t, (object)tokenSource);
}, tokenSource.Token);
task.Start();
然后,我想而不是循環執行任務,為什么不使用ContinueWith重新計划它呢? 我的下一個實現是這樣的:
public static void CheckTask2(Task task, object objParam)
{
CancellationTokenSource tokenSource = (CancellationTokenSource)objParam;
// Do some processing
Console.WriteLine("Processing");
// Sleep awhile and wait for cancellation
if(tokenSource.Token.WaitHandle.WaitOne(1500))
{
Console.WriteLine("Cancel requested");
return;
}
// Reschedule
task.ContinueWith(CheckTask2, tokenSource);
}
第二種實現更容易讀寫,我的測試沒有區別,但是我仍然想知道ContinueWith本身是否有缺點?
我仍然想知道ContinueWith本身是否有缺點?
坦白說,我發現您的代碼在附加了連續性后不太可讀(但這僅基於風味)。 我看到的唯一缺點是您在令牌上使用了WaitHandle
,這迫使您現在必須配置CancellationToken
對象 :
訪問此屬性將導致實例化WaitHandle。 最好僅在必要時使用此屬性,然后盡早處置關聯的CancellationTokenSource實例(處置源將處置此分配的句柄)。 手柄不得關閉或直接放置。
相反,我發現帶有Task.Delay
的模式更加清晰易讀:
public static async Task CheckTask(CancellationToken token)
{
do
{
// Do some processing
Console.WriteLine("Processing");
await Task.Delay(1500, token);
} while (!token.IsCancellationRequested);
Console.WriteLine("Bye bye");
}
然后,當您要停止Task
,請通過CancellationTokenSource
取消它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.