首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果CancelIo失败了怎么办?

如果CancelIo失败了怎么办?
EN

Stack Overflow用户
提问于 2010-10-17 02:55:24
回答 4查看 1.1K关注 0票数 3

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

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

另外,木卫二、木卫三和卡利斯托的类似呼声似乎都不见了。我应该提交一个bug吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-12-06 05:34:16

我认为这里没有比我已经找到的更令人满意的答案了:

泄漏缓冲区(并抛出异常(或对您的环境执行等效操作))。

票数 0
EN

Stack Overflow用户

发布于 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之后仍处于挂起状态,则释放缓冲区可能会导致一系列不良副作用。

票数 0
EN

Stack Overflow用户

发布于 2010-10-18 05:59:30

你不应该在发出取消请求后立即删除你的缓冲区。

摘自CancelIoEx文档:

如果指定文件句柄有任何挂起的I/O操作正在进行,则CancelIoEx函数会将其标记为取消。大多数类型的操作可以立即取消;其他操作可以在实际取消之前继续完成,并通知调用者。CancelIoEx函数不会等待所有取消的操作完成。

因此,CancelIo不会“释放”io操作,而只是将其标记为“已取消”。您必须等待异步读/写的结果才能完成(成功或使用ERROR_OPERATION_ABORTED

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3950314

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档