c# - 当要求取消时,我应该选择扔掉还是返回?
问题描述
考虑以下两种通过 处理取消的方法CancellationToken
:
public async Task DoAllAvailableWork(CancellationToken cancelToken)
{
foreach (var job in GetAllAvailableWork())
{
await job.Process();
if (cancelToken.IsCancellationRequested())
return;
}
}
public async Task DoAllAvailableWork(CancellationToken cancelToken)
{
foreach (var job in GetAllAvailableWork())
{
await job.Process();
cancelToken.ThrowIfCancellationRequested();
}
}
在这种情况下job.Process()
,正在做一些一旦开始就不应或不能停止的原子工作,因此它不接受CancellationToken
.
有什么理由更喜欢其中一种方法而不是另一种?如果是,应该首选哪种方法?
检查IsCancellationRequested()
和返回对我来说感觉更干净,因为投掷意味着出现问题,取消是我们明确计划处理的情况(这就是我们接受 的原因CancellationToken
)。另一方面,调用者不一定知道我们将采用哪种方法,因此OperationCancelledException
无论我们选择哪个选项,他们都必须设置 try/catch。
解决方案
ThrowIfCancellationRequested
专为任务延续而设计。投掷会停止整个延续链(取消处理延续除外)。任务中未处理OperationCancelledException
的也将取消Task
的取消令牌(如果有)。
在你的情况下,没有Task
. 您可以自由定义自己的界面。但是请记住,调用您的方法的人也应该有办法查看您的操作是否被取消 - 毕竟,如果您拥有的只是同步方法,那么肯定是其他原因导致了取消。根据取消的含义,返回错误、空结果、错误或抛出异常(但可能OperationCancelledException
无论如何都不会!)可能每个都有意义 - 您需要根据您正在制作的界面类型对其进行定制。
推荐阅读
- ios - 'Branch.h' 文件未找到 Ionic 3 应用程序的 Xcode 错误
- tensorflow2.0 - 是否可以将 Tensorflow Graphics 的 Levenberg-Marquardt 优化器与 Tensorflow 2.0 模型集成?
- asp.net-core - 使用 Saml2 或 Ws Federation 在 IDM SAP 和 ADFS 上进行身份验证
- javascript - 使用 onClick 链接到 React/Semantic UI 中的组件
- c++ - C ++确定整个句子是否是回文,而不仅仅是第一个单词
- erlang - 如何在 Erlang 中将负数作为命令行参数传递
- algorithm - 具有重复项的旋转排序数组中的最小值
- monitoring - 如何promtail将json解析为标签和时间戳
- c# - 替换函数查询
- rest - 所有选定文档的 Sharepoint Online 工作流程