取消异步操作时应何时使用(只需返回):
if( ct.IsCancellationRequested) return;
,而不是此(引发异常):
if( ct.IsCancellationRequested) throw new TaskCanceledException(task);
答案 0 :(得分:1)
引发异常将停止该代码路径上的所有执行,直到适当的catch处理异常为止。它保证代码停止。它的停止是您必须从各种方法中多次返回,可能会检查布尔值返回值并创建分支逻辑。异常只会停止一切。
选择仍然取决于您,并且实际上取决于情况。
以下是一些Microsoft文档https://docs.microsoft.com/en-us/dotnet/standard/parallel-programming/task-cancellation
他们提到的一件值得注意的事情是
通过抛出OperationCanceledException并向其传递请求取消的令牌。执行此操作的首选方法是使用ThrowIfCancellationRequested方法。以这种方式取消的任务会转换为“已取消”状态,调用代码可以使用该状态来验证任务是否响应了其取消请求。
答案 1 :(得分:0)
不太可能需要抛出TaskCanceledException
。 TaskCanceledException
是已取消任务的结果,该任务保留与任务异步操作中抛出的CancellationToken
中的令牌匹配的OperationCanceledException
。
从您的代码段来看,您似乎可以使用:
ct.ThrowIfCancellationRequested
而不是更冗长的内容:
if (ct.IsCancellationRequested)
throw new OperationCancelledException(ct);
但尚不清楚在没有更多上下文的情况下最终应该建议哪个方向。存在用于异步操作以安静地取消/结束或通过OperationCancelledException
取消的用例。