首页 > 解决方案 > 等待取消任务的简洁方法?

问题描述

我发现自己经常写这样的代码:

try
{
    cancellationTokenSource.Cancel();
    await task.ConfigureAwait(false); // this is the task that was cancelled
}
catch(OperationCanceledException)
{
    // Cancellation expected and requested
}

鉴于我要求取消,这是意料之中的,我真的希望忽略该异常。这似乎是一个常见的情况。

有没有更简洁的方法来做到这一点?我错过了一些关于取消的事情吗?好像应该有task.CancellationExpected()方法什么的。

标签: c#async-awaittaskcancellationcancellation-token

解决方案


有一个内置机制,Task.WhenAny使用单个参数的方法,但不是很直观。

创建一个将在任何提供的任务完成时完成的任务。

await Task.WhenAny(task); // await the task ignoring exceptions
if (task.IsCanceled) return; // the task is completed at this point
var result = await task; // can throw if the task IsFaulted

它不直观,因为Task.WhenAny通常与至少两个参数一起使用。而且它的效率有点低,因为该方法接受一个params Task<TResult>[] tasks参数,所以每次调用时都会在堆中分配一个数组。


推荐阅读