【问题标题】:Canceling a task when the main thread has exited主线程退出时取消任务
【发布时间】:2011-09-27 05:01:19
【问题描述】:

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

if (cancelToken.IsCancellationRequested)
                {
                    return;
                }

然而,这似乎并没有以预期的方式工作。

之前我想过做 cancelToken.ThrowIfCancellationRequested() 但据我了解,这会引发异常,我在主线程中没有地方可以捕捉到它。在这种情况下取​​消任务的最佳方法是什么?

【问题讨论】:

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

标签: c# .net task


【解决方案1】:

大概你的cancelToken 最初来自主线程仍然可以访问的CancellationTokenSource。你应该可以打电话:

cancellationTokenSource.Cancel();

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

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

请注意,如果您只是在请求取消后返回,您的任务状态将结束为 RanToCompletion 而不是 Canceled。调用 ThrowIfCancellationRequested 是指示取消的首选方式,部分原因是这意味着如果您的任务代码中有一个很深的堆栈,则无需担心从每个方法显式返回。

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

【讨论】:

  • 我还要补充一点,任何 ContinueWith(TaskContinuationOptions.OnlyOnCanceled) 任务都希望抛出异常以“触发”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-10
相关资源
最近更新 更多