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