Dot-Net

在請求取消之前永遠不會結束的任務

  • May 13, 2014

我需要一個在請求取消之前永遠不會結束的任務。目前最簡單的方法是

var cancellation = new CancellationTokenSource();

var task = Task.Factory.StartNew(async () =>
{
   while (true)
   {
       await Task.Delay(10000, cancellation.Token);
   }
}, cancellation.Token).Unwrap();

我不喜歡呼叫Task.Delay方法,因為它需要有限的等待時間間隔。

有更優雅的解決方案嗎?

作為TaskCompletionSourcewith的替代方案token.Register,這裡有一些單行程式碼:

var task = new Task(() => {}, token); // don't do task.Run()!

或者,簡單地說:

var task = Task.Delay(Timeout.Infinite, token);

Timeout.Infinite目前的Task.Delay實現中甚至有一個很好的優化。

您應該能夠訂閱取消令牌並完成任務然後:

public static Task UntilCancelled(CancellationToken tok)
{
   var tcs = new TaskCompletionSource<object>();
   IDisposable subscription = null;
   subscription = tok.Register(() =>
   {
       tcs.SetResult(null);
       subscription.Dispose();
   });

   return tcs.Task;
}

引用自:https://stackoverflow.com/questions/23446528