Reputation: 2280
I need a task that never ends until cancellation is requested. At the moment 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();
What I don't like is a call to Task.Delay
method because it requires limited time interval for waiting.
Is there more elegant solution?
Upvotes: 10
Views: 2256
Reputation: 61736
As an alternative to TaskCompletionSource
with token.Register
, here are some one-liners:
var task = new Task(() => {}, token); // don't do task.Run()!
Or, simply this:
var task = Task.Delay(Timeout.Infinite, token);
There's even a nice optimization for Timeout.Infinite
in the current Task.Delay
implementation.
Upvotes: 11
Reputation: 144206
You should be able to subscribe to the cancellation of the token and complete the task then:
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;
}
Upvotes: 9