什么';Task.Lyield、Task.Run和ConfigureAwait(false)之间的区别是什么

本文关键字:Task false 之间 ConfigureAwait 区别 是什么 Lyield Run 什么 | 更新日期: 2023-09-27 18:00:59

据我所知,如果调用方没有等待该方法,则方法开头的Task.Yield将强制调用方继续。同时,Task.RunConfigureAwait(false)都在一个新的线程池线程上运行一个Task,这将再次迫使调用方在不等待该方法的情况下继续。

我无法理解Task.Yield和运行一个新的线程池线程之间的区别,因为在它返回到调用者之后,它将继续执行该方法的其余部分,这本质上是一样的。

这篇文章建议YieldTask.Factory.StartNew(实际上只是Task.Run的旧版本(可以互换使用,这似乎让我感到困惑

Task.Yield不是Task.Run的替代品,它与Task.ConfigureAwait无关

  • Task.Yield-生成一个awaitable,该awaitable在检查完成后立即完成
  • ConfigureAwait(false)-从忽略捕获的SynchronizationContext的任务中生成一个awaitable
  • Task.Run-在ThreadPool线程上执行委托

Task.YieldConfigureAwait的不同之处在于,它本身是可唤醒的,而不是另一个可唤醒的(即Task(的可配置包装器。另一个区别是Task.Yield确实在捕获的上下文上继续。

Task.Run与两者不同,因为它只接受一个委托并在ThreadPool上运行它,您可以将它与ConfigureAwait(false)一起使用,也可以不使用。

Task.Yield应该用于强制异步点,而不是作为Task.Run的替代。当在异步方法中达到wait时,它会检查任务(或其他可用任务(是否已经完成,如果已经完成,则同步继续。Task.Yield可以防止这种情况发生,因此它对测试很有用。

另一种用法是在UI方法中,您不想占用单个UI线程,而是插入一个异步点,其余的将安排在以后执行。

什么';Task.Lyield、Task.Run和ConfigureAwait(false)之间的区别是什么

Task.Yield在当前同步上下文或当前TaskScheduler(如果存在(上继续。Task.Run不这么做。它总是使用线程池。

例如,Task.Yield将停留在UI线程上。

避免Task.Yield。它的语义不太清楚。关联的答案是一种代码气味。