C#异步等待和线程池

C#异步等待和线程池,c#,multithreading,asynchronous,C#,Multithreading,Asynchronous,我知道,在UI线程上调用的方法上使用async和Wait时,可以释放UI线程来执行其他工作,同时等待一些IO完成。 如果对线程池线程调用的方法使用async Wait,那么该线程池线程会发生什么情况 当IO完成时?它回到游泳池了吗?IO完成时,在后一种情况下,哪个线程完成了方法?在这种情况下,继续在任何可用的线程池线程上执行 理论上,由等待者适当地安排延续,但通常当异步方法传入延续时,等待者捕获当前的SynchronizationContext,并在等待者完成时使用该同步上下文安排延续。(模块c

我知道,在UI线程上调用的方法上使用async和Wait时,可以释放UI线程来执行其他工作,同时等待一些IO完成。 如果对线程池线程调用的方法使用async Wait,那么该线程池线程会发生什么情况
当IO完成时?它回到游泳池了吗?IO完成时,在后一种情况下,哪个线程完成了方法?

在这种情况下,继续在任何可用的线程池线程上执行

理论上,由等待者适当地安排延续,但通常当异步方法传入延续时,等待者捕获当前的
SynchronizationContext
,并在等待者完成时使用该同步上下文安排延续。(模块
configurewait
调用等)

在线程池的情况下,没有同步上下文,因此只在任何线程池线程上调度继续。(在控制台应用程序的主线程上也是如此,或者基本上在没有设置同步上下文的任何线程上也是如此。)

如果在线程池线程调用的方法上使用async Wait,IO完成时该线程池线程会发生什么情况?它回到游泳池了吗

是,线程池线程将返回到线程池

当IO完成时,在后一种情况下,哪个线程完成了方法

默认情况下,
await
将捕获当前“上下文”,并在
await
完成时使用该上下文恢复
async
方法。此“上下文”是
SynchronizationContext.Current
,除非它是
null
,在这种情况下,“上下文”是
TaskScheduler.Current

在UI案例中,有一个UI
SynchronizationContext
,它导致
async
方法在UI线程上恢复执行。在线程池的情况下,
SynchronizationContext.Current
null
,而
TaskScheduler.Current
是线程池任务调度器。因此,
async
方法在线程池线程(任意线程,不一定是同一线程)上恢复

如果你想了解更多关于这种行为的信息,我有一个建议,你可能会觉得有用