在等效于同步运行相同操作的异步操作之后立即调用Task.Wait()吗?

Rob*_*vey 11 c# asynchronous task

换句话说,是

var task = SomeLongRunningOperationAsync();
task.Wait();
Run Code Online (Sandbox Code Playgroud)

功能相同

SomeLongRunningOperation();
Run Code Online (Sandbox Code Playgroud)

换句话说,是

var task = SomeOtherLongRunningOperationAsync();
var result = task.Result;
Run Code Online (Sandbox Code Playgroud)

功能相同

var result = SomeOtherLongRunningOperation();
Run Code Online (Sandbox Code Playgroud)

根据Task.Wait和Inlining,如果正在Wait执行的任务已经开始执行,Wait则必须阻止.但是,如果它尚未开始执行,则Wait可能能够将目标任务从其排队的调度程序中拉出,并在当前线程上内联执行.

这两个案例只是决定任务将在哪个线程上运行,如果你还在等待结果,那有关系吗?

如果在异步调用和Wait()?之间没有执行任何操作,那么在同步表单上使用异步表单有什么好处?

usr*_*usr 9

以下是一些差异:

  1. 计算可能在不同的线程上运行.如果此任务是基于CPU的,则可以在同一线程上运行,并且可以内联.这是不确定的.
  2. 如果没有内联发生,则在计算期间将使用另一个线程.这通常需要1MB的堆栈内存.
  3. 例外将包含在内AggregateException.异常堆栈将有所不同.
  4. 如果计算发布到当前同步上下文,则任务版本可能会死锁.
  5. 如果线程池最大化,则如果必须安排完成另一个任务的任务,则可能会死锁.
  6. 线程本地状态,例如HttpContext.Current(实际上不是线程本地但几乎是),可能是不同的.
  7. 主线程的线程中止将不会到达任务主体(除了内联).我不确定等待本身是否会中止.
  8. 创建一个Task内存屏障可以产生同步效果.

这有关系吗?通过此列表确定您自己.

这样做有好处吗?我什么都想不到.如果您的计算使用异步IO,那么等待将抵消异步IO带来的好处.一个例外是扇出IO,例如并行发出10个HTTP请求并等待它们.这样你就可以以一个线程为代价进行10次操作.

请注意,WaitResult在所有这些方面等同.

  • Wait 和 Result 是等价的。如果没有可用的同步版本,那么这是一个很好的理由,假设他出于某种原因确实想要同步操作模式(也许他正在实现一个接口)。但是,在典型的 ASP.NET 代码中,这种阻塞很容易出现死锁。 (2认同)