我了解到,在调用await之后,异步方法并不一定要在启动它们的同一线程中继续进行。
在另一个线程中继续进行异步流时,有哪些特殊情况?
是否可以强制将调用树中的所有异步方法都在同一线程中执行?(我不需要这个,只是想了解,为什么可能无法实现...)
我知道在现有SynchronizationContext的情况下,如果未调用ConfigureAwait(false),则在等待之后将再次使用原始线程。这不是这个问题的主题。
提前致谢 :)
我知道在现有SynchronizationContext的情况下,如果未调用ConfigureAwait(false),则在等待之后将再次使用原始线程。这不是这个问题的主题。
好吧,不,是的。
不,SynchronizationContext
不不必然意味着“同一线程”。它仅表示“相同的上下文”。如果该上下文是UI上下文,则该上下文确实引用相同的线程(UI线程)。如果该上下文是线程池上下文,则该上下文可以引用任何线程池线程。
是的,这的确是这个问题的主题,因为当前SynchronizationContext
(TaskScheduler
如果没有current,则为current SynchronizationContext
)确定了该方法在哪个线程上继续执行。
在另一个线程中继续进行异步流时,有哪些特殊情况?
在await
需要异步产生的点上,它将捕获其上下文(SynchronizationContext
或TaskScheduler
)。当准备好恢复该方法时,将在该上下文中恢复。通常,这可以是UI上下文(绑定到特定的UI线程),也可以是线程池上下文(可以使用任何线程池线程)。
ConfigureAwait(continueOnCapturedContext: false)
覆盖该行为,并始终在线程池线程上调度继续。
请注意,在线程池的情况下,该async
方法可能会或可能不会在它开始的同一线程上继续。它不一定表示不同的线程池线程-可以是任何线程池线程。
是否可以强制将调用树中的所有异步方法都在同一线程中执行?(我不需要这个,只是想了解,为什么可能无法实现...)
您不能强制执行,但可以将其设置为默认行为。您可以创建一个单线程SynchronizationContext
(或TaskScheduler
),然后在其中执行异步代码。如果这样做,则默认情况下await
将在同一线程上继续;但是如果需要,异步代码可以仅通过使用绕过该上下文ConfigureAwait(false)
,然后在线程池线程上继续执行。
AsyncContext
是单线程的示例SynchronizationContext
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句