因此,我最近阅读了很多文章,试图了解异步方法在.NET世界中的工作原理.
我真的很努力地了解异步呼叫是如何工作的,从实际呼叫HttpClient.GetAsync("https://google.com")
,一直到操作系统如何在网卡上发起呼叫.
让我困扰的是状态机如何知道何时调用它的MoveNext()
方法.
在网卡上,我们有一个系统中断(一旦我们得到请求响应),它会在短时间内控制CPU.CPU创建一个所谓的Deferred Procedure Call (DPC)
,OS内核跟踪并以高优先级执行这些DPC.在此之后,内核启动APC (asynchronous procedure call)
,换句话说,它通知进行异步调用的线程,并将Task
标记为已完成,并且可以恢复其执行.
我的问题是:
在Windows窗体应用程序中,我们有一个UI线程(它在屏幕上绘制窗口并响应用户事件).这个UI线程是否有某种类型的Task queue
,它会不时地询问是否有一个任务处于已完成状态?如果是,那么一切都有意义,我最初的问题也得到了回答.一旦操作系统将任务设置为已完成,并且UI线程看到了这一点,它将调用其状态机上的MoveNext()
方法.
但我最近听说UIThread没有这样的Task queue
.如果是这样的话,操作系统和应用程序本身怎么知道如何触发MoveNext()
方法呢?
我所做的一个假设是,操作系统在当前可用的任何线程中注入MoveNext()
的代码.但这仍然很奇怪.