Задача с токена отмены?
Учитывая токен отмены, я хотел бы создать из него ожидаемую задачу, которая никогда не будет полной, но может быть отменена. Мне нужно это для такого шаблона, который 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;
}