任务IsCanceled是假的,而我取消了

当我取消任务时,等待结果仍然为IsCanceled属性返回true。 似乎有些事情出了问题。

请指教。 这是代码:

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并因此触发CancelButton_Click方法时,会触发CallBack方法。 但是……当我检查myTaskToWaitFor.IsCanceled总是返回false并且我得到这个信息:Id = 1,Status = RanToCompletion,Method =“{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实际上被取消了,但代码没有继续(继续程序由于exception而关闭)。 有什么想法吗? 亲切的问候,

Matthijs

编辑:

使用TrowIfCancellationRequested进行测试是基于“ 当你在CancellationToken上调用ThrowIfCancellationRequested时会被取消,它会抛出一个OperationCanceledException。任务并行库知道这种类型的exception代表取消而不是失败,并且会以不同的方式对待它。例如,Task有一个名为IsCanceled的属性,当执行异步方法时抛出OperationCanceledException时会自动变为true。 “来自Alex Davies的C#5.0中的Async一书。

这就是为什么我认为我可以期望myTaskToWaitFor.IsCancelled返回true并且代码将继续。

ThrowIfCancellationRequested()是发出由于观察取消而存在的信号的理想方式。 这在调用者处其自身表示为exception,但您可以通过在await周围进行try / catch ,并简单地检查其中的原因来处理 – 无论是在任务上还是通过检查AggregateException