取消异步操作时。抛出TaskCanceledException还是只是返回?

时间:2018-09-28 14:49:57

标签: c# windows async-await

取消异步操作时应何时使用(只需返回):

if( ct.IsCancellationRequested) return;

,而不是此(引发异常):

if( ct.IsCancellationRequested) throw new TaskCanceledException(task);

2 个答案:

答案 0 :(得分:1)

引发异常将停止该代码路径上的所有执行,直到适当的catch处理异常为止。它保证代码停止。它的停止是您必须从各种方法中多次返回,可能会检查布尔值返回值并创建分支逻辑。异常只会停止一切。

选择仍然取决于您,并且实际上取决于情况。

以下是一些Microsoft文档https://docs.microsoft.com/en-us/dotnet/standard/parallel-programming/task-cancellation

他们提到的一件值得注意的事情是

  

通过抛出OperationCanceledException并向其传递请求取消的令牌。执行此操作的首选方法是使用ThrowIfCancellationRequested方法。以这种方式取消的任务会转换为“已取消”状态,调用代码可以使用该状态来验证任务是否响应了其取消请求。

答案 1 :(得分:0)

不太可能需要抛出TaskCanceledExceptionTaskCanceledException是已取消任务的结果,该任务保留与任务异步操作中抛出的CancellationToken中的令牌匹配的OperationCanceledException

从您的代码段来看,您似乎可以使用:

ct.ThrowIfCancellationRequested

而不是更冗长的内容:

if (ct.IsCancellationRequested)
    throw new OperationCancelledException(ct);

但尚不清楚在没有更多上下文的情况下最终应该建议哪个方向。存在用于异步操作以安静地取消/结束或通过OperationCancelledException取消的用例。