当使用异步 I/O(或 Win32 术语中的“重叠”I/O)时,我们需要处理OVERLAPPED
结构及其hEvent
成员。如果 I/O 函数会延迟读取或写入操作,我们会得到一个ERROR_IO_PENDING
错误代码,然后我们将等待异步操作完成一个WaitForXxxEvent
函数,然后我们将调用GetOverlappedResult
.
但是,如果 I/O 操作立即完成,我们将不会得到ERROR_IO_PENDING
,并且在读取操作中,我们的读取缓冲区将立即被填满。但是OVERLAPPED::hEvent
会员呢?它会被设置为信号状态吗?我还没有找到关于这一点的明确声明。
这个问题似乎毫无意义(如果我知道操作已经完成,为什么要处理该事件?),但是我有一个模仿重叠模式的库,我需要具有相同的确切行为。
正如edgar.holleis在他的评论中指出的那样,Raymond Chen在他的博客中解释了这一点:http: //blogs.msdn.com/b/oldnewthing/archive/2014/02/06/10497096.aspx
如果异步 I/O 同步完成,是否会发出 OVERLAPPED 结构中的 hEvent 信号?
是的。
当 I/O 完成时(无论是同步还是异步),都会发出事件信号并且完成状态通知会排队。该
GetOverlappedResult/Ex
函数可用于等待已经完成的 I/O;它只会立即返回。如果你问 HasOverlappedIoCompleted I/O 是否完成,并且 I/O 同步完成,它会正确报告,“是的,当然完成了。哎呀,很久以前完成了!”换句话说,您可以在逻辑上将异步 I/O 请求同步完成的情况视为异步完成。它只是在你眨眼之前异步完成。