Задача с токена отмены?

Учитывая токен отмены, я хотел бы создать из него ожидаемую задачу, которая никогда не будет полной, но может быть отменена. Мне нужно это для такого шаблона, который IMO должен быть довольно распространенным:

async Task DoStuff(Task t, CancellationToken ct)
{
   // t was made from TaskCompletionSource, 
   // both t and ct are beyond my control

   Task t2 = TaskFromCancellationToken(ct);
   await Task.WhenAny(t, t2);

   // do stuff
}

Лучшая идея, которую я получил до сих пор:

Task TaskFromCancelationToken(CancellationToken ct)
{
    return Task.Delay(Timeout.Infinite, ct);
}

Есть ли лучший способ сделать эту логику?

Ответ 1

Это не очень распространено, но достаточно распространено, чтобы быть частью моей библиотеки AsyncEx. Я использую что-то вроде:

public static Task AsTask(this CancellationToken cancellationToken)
{
    var tcs = new TaskCompletionSource<object>();
    cancellationToken.Register(() => tcs.TrySetCanceled(),
        useSynchronizationContext: false);
    return tcs.Task;
}