Dot-Net
在請求取消之前永遠不會結束的任務
我需要一個在請求取消之前永遠不會結束的任務。目前最簡單的方法是:
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; }