c# - 等待取消任务的简洁方法?
问题描述
我发现自己经常写这样的代码:
try
{
cancellationTokenSource.Cancel();
await task.ConfigureAwait(false); // this is the task that was cancelled
}
catch(OperationCanceledException)
{
// Cancellation expected and requested
}
鉴于我要求取消,这是意料之中的,我真的希望忽略该异常。这似乎是一个常见的情况。
有没有更简洁的方法来做到这一点?我错过了一些关于取消的事情吗?好像应该有task.CancellationExpected()
方法什么的。
解决方案
有一个内置机制,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
参数,所以每次调用时都会在堆中分配一个数组。
推荐阅读
- javascript - 为什么 jslint 在模板字符串上抱怨 Unexpected '`'
- python - IncrementalPCA 引发`RuntimeWarning:空切片的平均值`
- arrays - 一种根据第一个元素中的字符串长度从数组中删除元素的方法
- scala - 在 Scala 中初始化“最终”变量
- css - 如何在页面中找到准确的 CSS 选择器?
- python - Python 性能:将非常大的对象传递给函数,还是使用全局变量?
- html - 如何在引导程序中更改图像的宽度
- python - 是否有 Python 函数可以在标记化后用特定字符标记句子的开头和结尾?
- linux - 为声明式管道指定要在多操作系统代理 Jenkins 环境中使用的 Git 工具
- python - 如何序列化 Django ManyToMany 字段中的特定字段?