2011-09-27 92 views
0

我有一个主线程启动一个任务,但不等待它的完成。我也有一个取消按钮在用户界面上,点击我想取消任务。我试图在任务中的方法中的多个位置执行此操作:主线程退出时取消任务

if (cancelToken.IsCancellationRequested) 
       { 
        return; 
       } 

但是,这似乎并不能以所需的方式工作。

早先我想做cancelToken.ThrowIfCancellationRequested(),但据我了解,这引发了一个异常,我没有在主线程中抓住这个位置。在这种情况下取​​消任务的最好方法是什么?

+0

向我们展示你的任务的代码 –

回答

2

推测你的cancelToken最初来自主线程仍然可以访问的CancellationTokenSource。你应该可以拨打:

cancellationTokenSource.Cancel(); 

在你的取消按钮的点击事件处理程序。

ThrowIfCancellationRequested将在任务线程中抛出异常,而不是在主线程中。如果您在主线程中调用ThrowIfCancellationRequested,然后请求Result,则只会在主线程中看到异常。

请注意,如果您在取消请求后才返回,那么您的任务状态将最终为RanToCompletion而非Canceled。调用ThrowIfCancellationRequested是指示取消的首选方式,部分原因是这意味着如果您的任务代码中有深度堆栈,则不需要担心从每种方法显式返回。

我不确定取消是否代表需要观察的故障,顺便说一句 - 我嫌疑人不是,但你应该检查一下。 (你应该有一个延续来处理错误......)

+1

我还要补充说任何ContinueWith(TaskContinuationOptions.OnlyOnCanceled)任务都需要抛出一个异常以便“火”。 –