C#异步等待和线程池
我知道,在UI线程上调用的方法上使用async和Wait时,可以释放UI线程来执行其他工作,同时等待一些IO完成。 如果对线程池线程调用的方法使用async Wait,那么该线程池线程会发生什么情况C#异步等待和线程池,c#,multithreading,asynchronous,C#,Multithreading,Asynchronous,我知道,在UI线程上调用的方法上使用async和Wait时,可以释放UI线程来执行其他工作,同时等待一些IO完成。 如果对线程池线程调用的方法使用async Wait,那么该线程池线程会发生什么情况 当IO完成时?它回到游泳池了吗?IO完成时,在后一种情况下,哪个线程完成了方法?在这种情况下,继续在任何可用的线程池线程上执行 理论上,由等待者适当地安排延续,但通常当异步方法传入延续时,等待者捕获当前的SynchronizationContext,并在等待者完成时使用该同步上下文安排延续。(模块c
当IO完成时?它回到游泳池了吗?IO完成时,在后一种情况下,哪个线程完成了方法?在这种情况下,继续在任何可用的线程池线程上执行 理论上,由等待者适当地安排延续,但通常当异步方法传入延续时,等待者捕获当前的
SynchronizationContext
,并在等待者完成时使用该同步上下文安排延续。(模块configurewait
调用等)
在线程池的情况下,没有同步上下文,因此只在任何线程池线程上调度继续。(在控制台应用程序的主线程上也是如此,或者基本上在没有设置同步上下文的任何线程上也是如此。)
如果在线程池线程调用的方法上使用async Wait,IO完成时该线程池线程会发生什么情况?它回到游泳池了吗
是,线程池线程将返回到线程池
当IO完成时,在后一种情况下,哪个线程完成了方法
默认情况下,await
将捕获当前“上下文”,并在await
完成时使用该上下文恢复async
方法。此“上下文”是SynchronizationContext.Current
,除非它是null
,在这种情况下,“上下文”是TaskScheduler.Current
在UI案例中,有一个UISynchronizationContext
,它导致async
方法在UI线程上恢复执行。在线程池的情况下,SynchronizationContext.Current
是null
,而TaskScheduler.Current
是线程池任务调度器。因此,async
方法在线程池线程(任意线程,不一定是同一线程)上恢复
如果你想了解更多关于这种行为的信息,我有一个建议,你可能会觉得有用