调用的原因有很多CancelIo
,但在我的特殊情况下,我调用它是为了知道系统不再写入缓冲区。一旦知道这一点,我就可以安全地释放缓冲区。
但是如果CancelIo
失败了怎么办?我现在要做的是显式泄漏缓冲区并抛出异常。有没有更好的方法来处理这个问题?
PS 对 Europa、Ganymede 和 Callisto 的类似调用似乎不见了。我应该提交错误吗?
调用的原因有很多CancelIo
,但在我的特殊情况下,我调用它是为了知道系统不再写入缓冲区。一旦知道这一点,我就可以安全地释放缓冲区。
但是如果CancelIo
失败了怎么办?我现在要做的是显式泄漏缓冲区并抛出异常。有没有更好的方法来处理这个问题?
PS 对 Europa、Ganymede 和 Callisto 的类似调用似乎不见了。我应该提交错误吗?
MSDN 文档对可能返回的错误不是很清楚。我想(因为CancelIo
无论如何都是异步的)这意味着您使用了错误的句柄,或者类似的东西。我所说的异步是指仅仅因为CancelIo
返回 OK,您不能立即为任何挂起的 I/O 释放缓冲区。
文档中指出,挂起的 I/O 将以ERROR_OPERATION_ABORTED
. 我认为您已经跟踪了挂起的 I/O 状态,这样当且仅当所有挂起的 I/O 都返回此错误时,您才能安全地释放缓冲区。如果挂起的 I/O 在 之后挂起CancelIo
,则释放缓冲区可能会导致一系列不良副作用。
发出取消请求后,您不应立即删除缓冲区。
取自CancelIoEx文档:
如果指定文件句柄的任何未决 I/O 操作正在进行中,CancelIoEx 函数会将它们标记为取消。大多数类型的操作可以立即取消;其他操作可以在实际取消并通知调用者之前继续完成。CancelIoEx 函数不会等待所有取消的操作完成。
因此CancelIo
不会“释放” io 操作,而是仅将其标记为“已取消”。您必须等待异步读/写的结果才能完成(成功或使用ERROR_OPERATION_ABORTED
.
我认为这里没有比我已经找到的答案更令人满意的答案了:
泄漏缓冲区(并抛出异常(或为您的环境执行等效操作))。
我的回答可能与你的问题无关。但可以帮助..
在异步 IO..CancelIoEx 中取消挂起的 IO。如果有待处理的 IO,则返回 1 并生成完成消息或调用完成代码。如果没有挂起的 IO,它将返回 0,错误码为 1168..没有完成消息,也没有调用完成代码。但实际上。在调用 cancelioex 之后可能会到达预定的 IO。这都是万恶之源。我以为取消了所有的IO。但是还有剩余的IO ..