任务是取消是假的,而我取消了
本文关键字:取消 任务 | 更新日期: 2023-09-27 18:30:51
当我取消任务时,等待结果仍然返回 true(对于 IsCanceled 属性)。似乎出了什么问题。
请指教。这是代码:
CancellationTokenSource _cancelLationToken = new CancellationTokenSource();
private async void Button_Click(object sender, EventArgs e)
{
_cancelLationToken = new CancellationTokenSource();
_cancelLationToken.Token.Register(theCallBack);
var myTaskToWaitFor = Task.Factory.StartNew(() => WorkHard(_cancelLationToken.Token), _cancelLationToken.Token);
await myTaskToWaitFor;
int i=0;
if(myTaskToWaitFor.IsCanceled)
i = i; //breakpoint for debugging
else
i = i; //breakpoint for debugging <== always ends here... :-(
}
private void WorkHard(CancellationToken token)
{
for(int i = 0; i < 100000000; i++)
if(token.IsCancellationRequested)
break;
else
Math.Acos(Math.Pow(i, i / 10000000));
}
public void theCallBack()
{
//todo: do something
}
private void CancelButton_Click(object sender, EventArgs e)
{
_cancelLationToken.Cancel();
}
当我点击取消按钮并因此触发CancelButton_Click方法时,将触发回调方法。但。。。当我检查myTaskToWaitFor.IsCanceled总是返回false时,我得到以下信息:Id = 1,状态= RanToCompletion,方法="{null}"。为什么状态不是"已取消"或其他什么?
当我使用 http://msdn.microsoft.com/en-us/library/system.threading.cancellationtoken.throwifcancellationrequested.aspx
喜欢这个:
private void WorkHard(CancellationToken token)
{
for(int i = 0; i < 100000000; i++)
if(token.IsCancellationRequested)
token.ThrowIfCancellationRequested();
else
Math.Acos(Math.Pow(i, i / 10000000));
}
我只在调试模式下收到一些错误,似乎 myTaskToWaitFor 实际上被取消了,但代码没有继续(继续时,程序由于异常而关闭)。有什么想法吗?亲切问候
马蒂斯
编辑:
使用TrowIfCancelRequest的测试是基于"当您在取消令牌上调用 ThrowIfCancelRequest 时,它将抛出一个操作取消异常。任务并行库知道这种类型的异常表示取消而不是失败,并且将处理它不同。例如,Task 具有一个名为 IsCanceled 的属性,该属性会自动当执行异步时引发操作取消异常时变为 true方法。摘自 Alex Davies 的 C# 5.0 中的异步一书。
这就是为什么我认为我可以期望myTaskToWaitFor.IsCancel返回true并且代码将继续。
ThrowIfCancellationRequested()
是表明您由于观察到取消而存在的理想方式。这将在调用者处显示为异常,但是您可以通过在await
周围放置一个try
/catch
来处理它,并简单地检查那里的原因 - 无论是在任务上,还是通过检查AggregateException
。