C# 操作系统如何发布异步io的io完成消息

C# 操作系统如何发布异步io的io完成消息,c#,winapi,asynchronous,async-await,C#,Winapi,Asynchronous,Async Await,需要在异步IO完成时发出信号。这可以由用户手动调用或操作系统在异步IO完成时自动执行。操作系统如何自动执行此操作,以及在哪个线程上执行此操作?在这种情况下,磁盘驱动器和操作系统之间的通信是如何工作的 调试对的调用时,我尝试在visual studio中的PostQueuedCompletionStatus上设置断点,但始终没有成功。操作系统将向与完成端口关联的一个线程提供状态。这意味着调用该端口的任何线程。该链接指向MSDN上的更多IOCP资料。正如Harry指出的,IO完成事件的队列由wind

需要在异步IO完成时发出信号。这可以由用户手动调用或操作系统在异步IO完成时自动执行。操作系统如何自动执行此操作,以及在哪个线程上执行此操作?在这种情况下,磁盘驱动器和操作系统之间的通信是如何工作的


调试对的调用时,我尝试在visual studio中的PostQueuedCompletionStatus上设置断点,但始终没有成功。

操作系统将向与完成端口关联的一个线程提供状态。这意味着调用该端口的任何线程。该链接指向MSDN上的更多IOCP资料。

正如Harry指出的,IO完成事件的队列由windows内核处理。IO完成后,磁盘将发送一个由操作系统处理的消息。操作系统处理程序可能会将完成消息排队到相应的IOCP。

您正在进行内核调试吗?您是如何在
PostQueuedCompletionStatus
中添加断点的?@SriramSakthivel-
PostQueuedCompletionStatus
是用户模式函数。。。不知道你为什么说“内核”。。。也许你的意思是“混合模式调试”?我在VS中使用了“函数中断”功能,并输入了“PostQueuedCompletionStatus”。我还发现“GetQueuedCompletionStatus”处的断点被成功命中。在大多数情况下,I/O完成事件的排队由内核在任意线程上下文中处理。无法从用户模式调试器对其进行调试。(也有例外,例如Winsock服务提供商使用该函数。)细节远比这复杂——a和a之间的区别只是一个例子——但是,是的,这大体上是正确的。调试方面的关键点是,代码在CPU当时运行的任何线程的上下文中运行,而不一定是一个线程,该线程甚至属于启动相关I/O的进程或用户。OP询问是哪个线程将事件添加到队列中,不是关于哪个线程从队列接收事件。