簡體   English   中英

使用ContinueWith的自我繼續任務

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM