据我了解,Task.Yield
如果调用者没有等待该方法,则在方法开始处将强制调用者继续。同时Task.Run
and ConfigureAwait(false)
both https://stackoverflow.com/questions/14906092/what-are-the-differences-between-using-configureawaitfalse-and-task-run在新的线程池线程上运行任务,如果调用者不等待该方法,这将再次强制调用者继续。
我无法理解之间的区别Task.Yield
并运行一个新的线程池线程,因为在它返回到调用者之后,它将继续执行该方法的其余部分,这本质上是相同的事情。
This https://stackoverflow.com/a/20320899/4077294帖子表明Yield
and Task.Factory.StartNew
(这实际上只是旧版本Task.Run
)可以互换使用,这让我感到困惑。
Task.Yield
不能替代Task.Run
这与Task.ConfigureAwait
.
-
Task.Yield
- 生成一个等待,在检查完成后立即完成。
-
ConfigureAwait(false)
- 从忽略捕获的任务生成等待SynchronizationContext
.
-
Task.Run
- 执行委托ThreadPool
thread.
Task.Yield
不同于ConfigureAwait
因为它本身就是一个可等待的,而不是另一个可等待的可配置包装器(即Task
)。另一个区别是Task.Yield
继续捕获的上下文。
Task.Run
与两者不同,因为它只需要一个委托并在ThreadPool
,你可以使用它ConfigureAwait(false)
或没有。
Task.Yield
应该用于强制异步点,而不是作为替代Task.Run
。当在异步方法中到达等待时,它会检查任务(或其他可等待的任务)是否已完成,如果是,则继续同步。Task.Yield
可以防止这种情况发生,因此对于测试很有用。
另一种用法是在 UI 方法中,您不想占用单个 UI 线程,可以插入一个异步点,其余部分安排在稍后执行。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)