调用CancelIo的原因有很多,但在我的特殊情况下,我调用它是为了知道系统不再写入缓冲区。一旦我知道了这一点,我就可以安全地释放缓冲区。
但是,如果CancelIo失败了呢?我现在所做的就是显式地泄漏缓冲区并抛出一个异常。有没有更好的方法来解决这个问题?
另外,木卫二、木卫三和卡利斯托的类似呼声似乎都不见了。我应该提交一个bug吗?
发布于 2010-12-06 05:34:16
我认为这里没有比我已经找到的更令人满意的答案了:
泄漏缓冲区(并抛出异常(或对您的环境执行等效操作))。
发布于 2010-10-17 03:05:25
MSDN文档对于可能返回的错误并不是很清楚。我想(因为CancelIo无论如何都是异步的)这意味着你使用了一个错误的句柄,或者类似的东西。所谓异步,我的意思是,仅仅因为CancelIo返回OK,您就不能立即为任何挂起的I/O释放缓冲区。
It 是文档中声明的,挂起的I/O将随ERROR_OPERATION_ABORTED一起返回。我认为您已经跟踪了挂起的I/O状态,这样,当且仅当所有挂起的I/O都返回此错误时,您才能安全地释放缓冲区。如果挂起的I/O在CancelIo之后仍处于挂起状态,则释放缓冲区可能会导致一系列不良副作用。
发布于 2010-10-18 05:59:30
你不应该在发出取消请求后立即删除你的缓冲区。
摘自CancelIoEx文档:
如果指定文件句柄有任何挂起的I/O操作正在进行,则CancelIoEx函数会将其标记为取消。大多数类型的操作可以立即取消;其他操作可以在实际取消之前继续完成,并通知调用者。CancelIoEx函数不会等待所有取消的操作完成。
因此,CancelIo不会“释放”io操作,而只是将其标记为“已取消”。您必须等待异步读/写的结果才能完成(成功或使用ERROR_OPERATION_ABORTED。
https://stackoverflow.com/questions/3950314
复制相似问题