如果CancelIo失败怎么办?

时间:2010-10-16 18:55:24

标签: winapi asynchronous io cancelio

调用CancelIo有很多理由,但在我的特殊情况下,我正在调用它以便知道系统不再写入缓冲区。一旦我知道了,我就可以安全地释放缓冲区了。

但如果CancelIo失败怎么办?我现在所做的是显式泄漏缓冲区并抛出异常。有没有更好的方法来解决这个问题?

P.S。似乎缺少对Europa,Ganymede和Callisto的类似呼吁。我应该提交错误吗?

4 个答案:

答案 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 ..