C#异步等待和线程池

5

我理解当在UI线程上调用异步和等待方法时,UI线程可以被释放以执行其他工作,同时等待一些IO完成。 如果我在由线程池线程调用的方法上使用异步等待,那么在线程池线程等待IO完成时会发生什么? 它会返回到线程池吗?在后一种情况下,当IO完成时,哪个线程完成该方法?

2个回答

4
在这种情况下,继续执行在任何可用的线程池线程上。
理论上来说,由awaitable适当地安排继续执行,但通常当异步方法传递继续执行时,awaitable会捕获当前的SynchronizationContext,并使用该同步上下文在awaitable完成时安排继续执行。(模块ConfigureAwait调用等)
在线程池的情况下,没有同步上下文,因此继续执行仅在任何线程池线程上安排。(在控制台应用程序的主线程上或基本上未设置同步上下文的任何线程上都是如此。)

3
如果我在由线程池线程调用的方法上使用async await,当IO完成时,线程池线程会发生什么?它会返回到池中吗?
是的,线程池线程会返回到线程池。
当IO完成时,哪个线程会完成此后一种情况下的方法?
默认情况下,await将捕获当前“上下文”,并在await完成时使用它来恢复异步方法。除非它为null,否则该“上下文”是SynchronizationContext.Current,否则是TaskScheduler.Current。
在UI情况下,有一个UI SynchronizationContext导致异步方法在UI线程上恢复执行。在线程池情况下,SynchronizationContext.Current为null,而TaskScheduler.Current是线程池任务调度程序。因此,异步方法在线程池线程(任意线程,不一定是相同的线程)上恢复执行。
如果您想了解更多关于这种行为的信息,我有一个async入门可能会对您有所帮助。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接