首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >任务取消抛出异常

任务取消抛出异常
EN

Stack Overflow用户
提问于 2015-04-21 15:11:29
回答 3查看 1.5K关注 0票数 1

因此,根据对这个职位的回答:

2)如果任务的主体也监视取消令牌并抛出包含该令牌的OperationCanceledException (这就是ThrowIfCancellationRequested所做的),那么当任务看到该OCE时,它会检查OCE的令牌是否与任务的令牌匹配。如果是这样,则将该异常视为对协作取消和任务过渡到已取消状态(而不是错误状态)的确认。

由此我了解到,通过将令牌传递给任务的构造函数,然后调用该令牌的ThrowIfCancellationRequested()方法,任务实际上将和平终止,而不必显式地捕获OperationCanceledException。

然而,事实证明,有一个例外被抛出,所以我相信我可能误解了机修工。

我的代码:

代码语言:javascript
复制
  public void AI()
    {
        IsBusy = true;
        var token = stopGameCancellationTokenSource.Token;
        var workTask = new Task(() => aiWork(token), token);
        workTask.Start();
        workTask.ContinueWith(task => { IsBusy = false; });

    }

    private void aiWork(CancellationToken token)
    {

        while ( true)
        {

             //Some computation being done here

            token.ThrowIfCancellationRequested(); //Exception is thrown here, I thought it wouldn't

            //More computation here, which I don't want to happen if cancellation has benn requested
        }
    }
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-04-21 15:19:48

这条线

代码语言:javascript
复制
token.ThrowIfCancellationRequested();

显式抛出异常。链接告诉您的是,如果任务的令牌与刚才抛出的OperationCanceledException中的令牌匹配,“任务将转换到已取消的状态(而不是错误状态)”。

因此,底线是,如果您不希望在任务被取消时抛出异常,只需省略这一行!

票数 3
EN

Stack Overflow用户

发布于 2015-04-21 15:31:36

除了在@JurgenCamilleri 回答 of 中解释为什么要得到错误之外,您可能要做的是循环直到请求取消为止。您可以通过将代码更改为如下内容来做到这一点:

代码语言:javascript
复制
private void aiWork(CancellationToken token)
{
    while (!token.IsCancellationRequested)
    {
        //Some computation being done here

        if (token.IsCancellationRequested)
            break; // need to cancel

        //More computation here, which I don't want to happen if cancellation has been requested
    }
}    
票数 2
EN

Stack Overflow用户

发布于 2015-04-21 15:32:29

正如该方法的名称所示,如果请求取消,ThrowIfCancellationRequested将引发异常(OperationCanceledException)。

如果您真的不希望抛出异常,可以检查token.IsCancellationRequested是否为真,在本例中,退出函数。但是,除非你有充分的理由不这么做,否则我会重新考虑继续使用token.ThrowIfCancellationRequested()

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29776231

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档