实战经验:通过NotifyAddrChange侦测网络变化( 三 )

当一个函数以重叠I/O的方式执行时 , 这个函数会立即返回 , 不管I/O操作是否完成 。 这个执行模式可以使得较为耗时的I/O操作在后台执行 , 调用线程可以继续执行其他任务 。

那么 , 如何知道I/O操作是否执行完成呢?

有以下两种方法

1) 通过使用GetOverlappedResult来等待I/O操作是否完成 。 GetOverlappedResult的升级版GetOverlappedResultEx还可以指定一个等待超时时间 。 在这种情况下 , 我们需要将 GetOverlappedResult的最后一个bWait参数设置成TRUE 。

2) 在初始化OVERLAPPED结构体时 , 我们指定一个手动重置的事件对象句柄 , 然后执行I/O函数调用 , 此时I/O函数因为执行重叠I/O会立即返回 , 如果想知道操作什么时候完成 , 可以使用WaitForSingleObject来等待这个事件句柄 , 等待成功后 , 继续使用GetOverlappedResult来获取I/O操作的更详细的操作结果 , 例如 , 本次I/O操作实际传输的多少个字节 。

如果需要取消重叠I/O , 我们可以使用CancelIoEx并传递一个OVERLAPPED结构体 , 此结构体包含待取消的目标句柄 , 此函数将尝试取消正在进行的I/O操作 。

推荐阅读