用于取消任务并等待其终止的选项
本文关键字:终止 选项 等待 取消 任务 用于 | 更新日期: 2023-09-27 18:32:37
我需要取消挂起的任务并等待其终止,然后代码流才能继续。通常,我这样做:
if (this.task != null)
{
this.taskCancellationTokenSource.Cancel();
try
{
await this.task;
// I don't need to know the result, just log it
Debug.Print(this.task.Status.ToString());
}
catch (Exception e)
{
// I don't need to know the result, just log it
Debug.Print(e.ToString());
}
}
我刚刚意识到我可以在没有try/catch
的情况下做同样的事情:
if (this.task != null)
{
this.taskCancellationTokenSource.Cancel();
await this.task.ContinueWith(
// I don't need to know the result, just log it
(t) => Debug.Print(((object)t.Exception ?? (object)t.Status).ToString()),
TaskContinuationOptions.ExecuteSynchronously)
}
我是否错过了我应该坚持第一种方法的任何理由?
我是否错过了我应该坚持第一种方法的任何理由?
两个原因,在我的头顶上:
- 默认情况下,
ContinueWith
将使用当前计划程序,这可能会导致并发问题或意外行为。 - 当您读取
Task.Exception
属性时,先行任务(在您的示例中t
)将具有包装在AggregateException
中的任何异常。
我建议使用 await
而不是 ContinueWith
,因为它在这两种情况下都有更合理的行为。 await
将捕获当前上下文并使用它来安排继续,并且await
不会将异常包装在AggregateException
中。
如果使用 ContinueWith
,则应始终显式指定运行延续的TaskScheduler
。