在请求取消之前永远不会结束的任务

时间:2014-05-03 15:44:37

标签: .net asynchronous task-parallel-library

我需要一项永不停止的任务,直到请求取消。目前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方法,因为它需要有限的等待时间间隔。

有更优雅的解决方案吗?

2 个答案:

答案 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 implementationTimeout.Infinite的优化效果非常好。