我需要取消待处理的任务,并在代码流可以继续之前等待终止。通常,我这样做:
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)
}
我是否错过了任何我应该坚持第一种方法的理由?
答案 0 :(得分:2)
我是否错过了任何我应该坚持第一种方法的理由?
有两个原因,我的头脑:
ContinueWith
将使用当前的调度程序,这可能会导致并发问题或令人惊讶的行为。t
属性时,先前任务(示例中为AggregateException
)将包含在Task.Exception
中的任何异常。我建议使用await
代替ContinueWith
,因为它在这两种情况下都有更合理的行为。 await
将捕获当前上下文并使用它来安排延续,await
不会在AggregateException
中包含例外。
如果您使用ContinueWith
,则应始终明确指定TaskScheduler
以继续运行。