以下不是多余的?
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'
答案 0 :(得分:4)
ContinueWith(t => { if (t.IsFaulted) throw t.Exception; })
行的语义与await
任务直接CopyToBlobAsync
的语义不同:
Task
返回的ContinueWith
被取消,Task
返回的CopyToBlobAsync
也会成功完成。这可能是故意行为。CopyToBlobAsync
的任何返回值都将被删除。AggregateException
来包装t.Exception
中的任何例外。这几乎肯定是有缺陷的行为。所以它不是完全多余的,并且可能是一个错误。
您可以在某些情况下使用ContinueWith
而不是await
任务。在我的代码中,我通常只在延续很简单的情况下执行此操作,我不需要继续中的上下文,并且我不希望async
状态机的开销。在大多数情况下,您可能希望await
可能与ConfigureAwait(false)
结合使用。
你最后的例子不一样;默认情况下,ContinueWith
将在线程池上执行,而默认情况下await
将捕获上下文并在该上下文中执行延续。此外,您必须非常小心如何在延续中使用任务:您通常希望将异常和取消传播到延续任务,这并不像第一次出现那么容易。
简而言之,我几乎在每个场景中都推荐await
。它更容易编写,更易于阅读,并且具有合理的默认行为。