C# 任务取消引发异常

C# 任务取消引发异常,c#,wpf,task,cancellationtokensource,C#,Wpf,Task,Cancellationtokensource,因此,根据对以下问题的回答: 2) 如果任务主体也在监视取消令牌 并抛出包含该令牌的OperationCanceledException(该令牌 是ThrowIfCancellationRequested所做的),然后当任务看到 该OCE检查OCE的令牌是否与任务的令牌匹配。 如果确实如此,则该例外被视为对 协作取消和任务转换到已取消的 状态(而不是故障状态) 由此我了解到,通过将令牌传递给任务的构造函数,然后调用同一令牌的throwifcancellationrequest()方法,任务实际上

因此,根据对以下问题的回答:

2) 如果任务主体也在监视取消令牌 并抛出包含该令牌的OperationCanceledException(该令牌 是ThrowIfCancellationRequested所做的),然后当任务看到 该OCE检查OCE的令牌是否与任务的令牌匹配。 如果确实如此,则该例外被视为对 协作取消和任务转换到已取消的 状态(而不是故障状态)

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

然而,结果是抛出了一个异常,所以我相信我可能误解了机械师

我的代码:

  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
        }
    }
这条线

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

因此,底线是如果您不希望在任务取消时引发异常,只需忽略该行即可

这条线

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


因此,底线是如果您不希望在任务取消时引发异常,只需忽略该行即可

除了@JurgenCamilleri中解释您为什么会出现错误之外,您可能还打算循环直到请求取消。您可以将代码更改为以下内容:

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
    }
}    

除了@JurgenCamilleri中解释您为什么会出现错误之外,您可能还打算循环直到请求取消。您可以将代码更改为以下内容:

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
    }
}    

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

如果确实不希望抛出异常,可以检查
token.IsCancellationRequested
是否为true,在本例中,退出函数。
但是,我建议您坚持使用
令牌.throwifcancellationrequest()
,除非您有充分的理由不这样做。

正如该方法的名称所示,
throwifcancellationrequest
如果请求取消,将抛出异常(
OperationCanceledException

如果确实不希望抛出异常,可以检查
token.IsCancellationRequested
是否为true,在本例中,退出函数。 但是,我建议您坚持使用
token.throwifcancellationrequest()
,除非您有充分的理由不这样做