4

以下不是多余的吗?

await blob.CopyToBlobAsync(newBlob).
       ContinueWith((t) => { if (t.IsFaulted) throw t.Exception; });

好像没有ContinueWith调用,会直接抛出异常?

什么时候会使用 continueWith 而不是等待任务?

以下是一样的吗?

await myTask.ContinueWith(t => {'do something with the task t'});

await myTask;
'do something with the task MyTask'
4

1 回答 1

4

该行具有与直接执行任务ContinueWith(t => { if (t.IsFaulted) throw t.Exception; })不同的语义awaitCopyToBlobAsync

  • 它忽略取消结果;即使return by被取消,Taskreturn by也会成功完成。这可能是故意行为。ContinueWithTaskCopyToBlobAsync
  • 它忽略了成功的结果;from 的任何返回值CopyToBlobAsync都会被删除。
  • AggregateException它通过直接抛出来包装任何异常t.Exception。这几乎可以肯定是错误的行为。

所以这并不是完全多余的,而且可能是一个错误。

您可以ContinueWith在某些情况下使用而不是await任务。在我的代码中,我通常只在延续很简单的情况下这样做,我不需要延续中的上下文,并且我不想要async状态机的开销。对于大多数情况,您应该更喜欢await可能与ConfigureAwait(false).

你的最后一个例子不一样;ContinueWith默认情况下将在线程池上执行,而await默认情况下将捕获上下文并在该上下文中执行延续。此外,您必须非常小心如何在延续任务中使用该任务:您通常希望将异常和取消传播到延续任务,这并不像最初看起来那么容易。

简而言之,我await几乎在所有情况下都推荐。它更容易编写,更容易阅读,并且具有合理的默认行为。

于 2013-04-22T11:24:49.033 回答