在重叠Win32结构hEvent成员

当使用asynchronousI / O(或Win32行话中的“重叠”I / O)时,我们需要处理OVERLAPPED结构和他的hEvent成员。 如果I / O函数会延迟读取或写入操作,我们将得到一个ERROR_IO_PENDING错误代码,然后我们将等待asynchronous操作完成一个WaitForXxxEvent函数,然后调用GetOverlappedResult

但是,如果I / O操作立即完成,我们将不会获得ERROR_IO_PENDING ,并且在读取操作中,我们的读取缓冲区将立即被填充。 但是OVERLAPPED::hEvent成员呢? 它会被设置为信号状态? 我还没有find明确的说法。

这个问题似乎毫无意义(为什么处理事件,如果我知道该操作已经完成?),但是我有一个模仿重叠模式库,我需要有相同的确切行为。


正如edgar.holleis在他的评论中所指出的, Raymond Chen在他的博客中解释了这一点: http : //blogs.msdn.com/b/oldnewthing/archive/2014/02/06/10497096.aspx

如果一个asynchronousI / O同步完成,那么OVERLAPPED结构中的hEvent是否仍然有信号?

是。

当I / O完成时(无论是同步的还是asynchronous的),事件被发信号并且完成状态通知被排队。 GetOverlappedResult/Ex函数可用于等待已完成的I / O; 它只会立即返回。 如果你询问HasOverlappedIoCompleted I / O是否已经完成,并且I / O同步完成,它会正确地报告“是的,当然它已经完成了,哎呀,很久以前就完成了!

换句话说,您可以在逻辑上将asynchronousI / O请求的情况同步完成,就像它asynchronous完成一样。 它只是在你眨眼之前asynchronous完成。

不,不会的。 花了我好几年的时间才明白这一点:)