主线程退出时取消任务

时间:2011-09-27 05:01:20

标签: c# .net task

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

if (cancelToken.IsCancellationRequested)
                {
                    return;
                }

然而,这似乎并没有以理想的方式发挥作用。

之前我曾想过做cancelToken.ThrowIfCancellationRequested(),但据我所知,这引发了一个异常,我没有在主线程中找到它。在这种情况下取​​消任务的最佳方法是什么?

1 个答案:

答案 0 :(得分:2)

据推测,您的cancelToken最初来自主线程仍可访问的CancellationTokenSource。你应该可以打电话:

cancellationTokenSource.Cancel();

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

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

请注意,如果您在请求取消后返回,则您的任务状态最终将为RanToCompletion而不是Canceled。调用ThrowIfCancellationRequested是指示取消的首选方式,部分原因是如果你的任务代码中有一个深层堆栈,你不必担心从每个方法中明确返回。

我不确定取消是否代表了需要遵守的错误 - 顺便说一下 - 我怀疑不是,但你应该检查一下。 (无论如何,你应该继续处理错误......)