什么';Task.Lyield、Task.Run和ConfigureAwait(false)之间的区别是什么
本文关键字:Task false 之间 ConfigureAwait 区别 是什么 Lyield Run 什么 | 更新日期: 2023-09-27 18:00:59
据我所知,如果调用方没有等待该方法,则方法开头的Task.Yield
将强制调用方继续。同时,Task.Run
和ConfigureAwait(false)
都在一个新的线程池线程上运行一个Task,这将再次迫使调用方在不等待该方法的情况下继续。
我无法理解Task.Yield
和运行一个新的线程池线程之间的区别,因为在它返回到调用者之后,它将继续执行该方法的其余部分,这本质上是一样的。
这篇文章建议Yield
和Task.Factory.StartNew
(实际上只是Task.Run
的旧版本(可以互换使用,这似乎让我感到困惑
Task.Yield
不是Task.Run
的替代品,它与Task.ConfigureAwait
无关。
Task.Yield
-生成一个awaitable,该awaitable在检查完成后立即完成ConfigureAwait(false)
-从忽略捕获的SynchronizationContext
的任务中生成一个awaitableTask.Run
-在ThreadPool
线程上执行委托
Task.Yield
与ConfigureAwait
的不同之处在于,它本身是可唤醒的,而不是另一个可唤醒的(即Task
(的可配置包装器。另一个区别是Task.Yield
确实在捕获的上下文上继续。
Task.Run
与两者不同,因为它只接受一个委托并在ThreadPool
上运行它,您可以将它与ConfigureAwait(false)
一起使用,也可以不使用。
Task.Yield
应该用于强制异步点,而不是作为Task.Run
的替代。当在异步方法中达到wait时,它会检查任务(或其他可用任务(是否已经完成,如果已经完成,则同步继续。Task.Yield
可以防止这种情况发生,因此它对测试很有用。
另一种用法是在UI方法中,您不想占用单个UI线程,而是插入一个异步点,其余的将安排在以后执行。
Task.Yield
在当前同步上下文或当前TaskScheduler
(如果存在(上继续。Task.Run
不这么做。它总是使用线程池。
例如,Task.Yield
将停留在UI线程上。
避免Task.Yield
。它的语义不太清楚。关联的答案是一种代码气味。