C# 任务取消引发异常
因此,根据对以下问题的回答: 2) 如果任务主体也在监视取消令牌 并抛出包含该令牌的OperationCanceledException(该令牌 是ThrowIfCancellationRequested所做的),然后当任务看到 该OCE检查OCE的令牌是否与任务的令牌匹配。 如果确实如此,则该例外被视为对 协作取消和任务转换到已取消的 状态(而不是故障状态) 由此我了解到,通过将令牌传递给任务的构造函数,然后调用同一令牌的throwifcancellationrequest()方法,任务实际上将和平终止,而不必显式捕获OperationCanceledException 然而,结果是抛出了一个异常,所以我相信我可能误解了机械师 我的代码:C# 任务取消引发异常,c#,wpf,task,cancellationtokensource,C#,Wpf,Task,Cancellationtokensource,因此,根据对以下问题的回答: 2) 如果任务主体也在监视取消令牌 并抛出包含该令牌的OperationCanceledException(该令牌 是ThrowIfCancellationRequested所做的),然后当任务看到 该OCE检查OCE的令牌是否与任务的令牌匹配。 如果确实如此,则该例外被视为对 协作取消和任务转换到已取消的 状态(而不是故障状态) 由此我了解到,通过将令牌传递给任务的构造函数,然后调用同一令牌的throwifcancellationrequest()方法,任务实际上
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()
,除非您有充分的理由不这样做