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()
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;
}
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.