加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 请求取消时我是否应该抛出或退回?

发布时间:2020-12-15 22:53:22 所属栏目:百科 来源:网络整理
导读:考虑以下两种通过CancellationToken处理取消的方法: public async Task DoAllAvailableWork(CancellationToken cancelToken){ foreach (var job in GetAllAvailableWork()) { await job.Process(); if (cancelToken.IsCancellationRequested()) return; }}p
考虑以下两种通过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!)可能每个都有意义 – 你需要根据你正在制作的界面来定制它.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读