我需要一项永不停止的任务,直到请求取消。目前the simplest way to do that is:
var cancellation = new CancellationTokenSource();
var task = Task.Factory.StartNew(async () =>
{
while (true)
{
await Task.Delay(10000, cancellation.Token);
}
}, cancellation.Token).Unwrap();
我不喜欢的是调用Task.Delay
方法,因为它需要有限的等待时间间隔。
有更优雅的解决方案吗?
答案 0 :(得分:7)
您应该能够订阅取消令牌并完成任务,然后:
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;
}
答案 1 :(得分:6)
作为TaskCompletionSource
token.Register
的替代方案,以下是一些单行:
var task = new Task(() => {}, token); // don't do task.Run()!
或者,简单地说:
var task = Task.Delay(Timeout.Infinite, token);
current Task.Delay
implementation中Timeout.Infinite
的优化效果非常好。