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