首页 > 解决方案 > 当要求取消时,我应该选择扔掉还是返回?

问题描述

考虑以下两种通过 处理取消的方法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。

标签: c#async-awaitcancellationcancellation-token

解决方案


ThrowIfCancellationRequested专为任务延续而设计。投掷会停止整个延续链(取消处理延续除外)。任务中未处理OperationCancelledException的也将取消Task的取消令牌(如果有)。

在你的情况下,没有Task. 您可以自由定义自己的界面。但是请记住,调用您的方法的人也应该有办法查看您的操作是否被取消 - 毕竟,如果您拥有的只是同步方法,那么肯定是其他原因导致了取消。根据取消的含义,返回错误、空结果、错误或抛出异常(但可能OperationCancelledException无论如何都不会!)可能每个都有意义 - 您需要根据您正在制作的界面类型对其进行定制。


推荐阅读