在异步操作后立即调用Task.Wait()是否等同于同步运行相同的操作?换句话说,vartask=SomeLongRunningOperationAsync();任务.等待();功能相同SomeLongRunningOperation();换句话说,vartask=SomeOtherLongRunningOperationAsync();varresult=task.Result;函数相同varresult=SomeOtherLongRunningOperation();根据Task.Wait和Inlining,如果被等待的任务已经开始执行,Wait必须阻塞。但是,如果它还没有开始执行,Wait可能能够从其排队的调度程序中拉出目标任务并在当前线程上内联执行它。这两种情况只是决定任务运行在哪个线程上,你还在等结果有关系吗?如果在异步调用和Wait()之间没有执行任何操作,那么使用异步表单比使用同步表单有什么好处吗?以下是一些差异:计算可能在不同的线程上运行。如果此任务是基于CPU的并且可以内联,则它可能在同一线程上运行。这是不确定的。如果没有发生内联,则在计算期间将使用另一个线程。这通常需要1MB的堆栈内存。异常将被包装在AggregateException中。异常堆栈会有所不同。如果将计算发布到当前同步上下文,任务版本可能会死锁。如果线程池已最大化,如果您必须安排一个任务来完成另一个任务,则可能会发生死锁。线程局部状态,例如HttpContext.Current(实际上不是线程局部但几乎是线程局部的)可能不同。从主线程中止的线程不会到达任务主体(内联除外)。我不确定等待本身是否会中止。创建Task造成内存屏障,为什么能产生同步效果。有关系吗?使用此列表确定您自己。这样做有什么好处吗?我想不出任何事。如果你的计算使用了异步IO,那么等待就会抵消异步IO的好处。一个例外是扇出IO,例如并行发出10个HTTP请求并等待它们。这样你可以用一个线程做10个操作。请注意,Wait和Result在所有这些方面都是等效的。以上是C#学习教程:异步操作后立即调用Task.Wait()是否等同于同步运行相同的操作?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
