我有一个主线程启动任务,但不等待它完成。我在UI上也有一个取消按钮,点击该按钮我想取消该任务。我尝试在任务中的方法中的多个位置执行此操作:
if (cancelToken.IsCancellationRequested)
{
return;
}
然而,这似乎并没有以理想的方式发挥作用。
之前我曾想过做cancelToken.ThrowIfCancellationRequested(),但据我所知,这引发了一个异常,我没有在主线程中找到它。在这种情况下取消任务的最佳方法是什么?
答案 0 :(得分:2)
据推测,您的cancelToken
最初来自主线程仍可访问的CancellationTokenSource
。你应该可以打电话:
cancellationTokenSource.Cancel();
在取消按钮的点击事件处理程序中。
ThrowIfCancellationRequested
将在任务线程中抛出异常,而不是在主线程中抛出异常。如果您调用ThrowIfCancellationRequested
然后在主线程中请求Result
,则只会在主线程中看到异常。
请注意,如果您在请求取消后返回,则您的任务状态最终将为RanToCompletion
而不是Canceled
。调用ThrowIfCancellationRequested
是指示取消的首选方式,部分原因是如果你的任务代码中有一个深层堆栈,你不必担心从每个方法中明确返回。
我不确定取消是否代表了需要遵守的错误 - 顺便说一下 - 我怀疑不是,但你应该检查一下。 (无论如何,你应该继续处理错误......)