微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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的取消令牌(如果有的话).

在你的情况下,没有任务.您可以自由定义自己的界面.但请记住,无论谁调用你的方法,也应该有办法看看你的操作是否被取消 – 毕竟,如果你拥有的只是同步方法,那么其他东西必定会导致取消.取决于取消的含义,返回错误,空结果,错误或抛出异常(但可能不是OperationCancelledException!)可能每个都有意义 – 你需要根据你正在制作的界面来定制它.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐