换句话说,是
var task = SomeLongRunningOperationAsync();
task.Wait();
功能上与
相同SomeLongRunningOperation();
换句话说,是
var task = SomeOtherLongRunningOperationAsync();
var result = task.Result;
功能上与
相同var result = SomeOtherLongRunningOperation();
根据Task.Wait and Inlining,如果任务Wait
'已经开始执行,则Wait
必须阻止。但是,如果它尚未开始执行,Wait
可能能够将目标任务从其排队的调度程序中拉出,并在当前线程上内联执行。
这两个案例只是决定任务将在哪个线程上运行,如果你还在等待结果,那有关吗?
如果在异步调用和Wait()
之间没有执行任何操作,那么在同步表单上使用异步表单有什么好处吗?
答案 0 :(得分:9)
以下是一些差异:
AggregateException
中。异常堆栈将有所不同。HttpContext.Current
(实际上不是线程本地但几乎是),可能不同。Task
会导致内存障碍,为什么会产生同步效果。这有关系吗?通过此列表确定自己。
这样做有好处吗?我无法想到。如果您的计算使用异步IO,那么等待将抵消异步IO带来的好处。一个例外是扇出IO,例如并行发出10个HTTP请求并等待它们。这样你就可以以一个线程为代价进行10次操作。
请注意,Wait
和Result
在所有这些方面都是等效的。