首先,EndRead 的文档没有明确说明由 BeginRead 发起的异步读取操作是原子的或不可中断的。
问题
是否可以中断由 FileStream.BeginRead 启动的异步读取操作,以便它在填充缓冲区之前完成,返回到目前为止读入缓冲区的字节数,还是全有或全无操作?
换句话说,是否有一些像“Cancel_IO”这样的方法可以调用,这样当我调用 EndRead 时,不是等待读取所有可能的字节,而是由于读取被取消而更早返回?
背景
我已经阅读了 FileStream、BeginRead 和 EndRead 的文档。EndRead 没有任何能够触发操作过早完成的重载,返回部分已满的缓冲区。我感兴趣的是是否有人可以确认或否认 Windows 操作系统 API (Win32) 或磁盘驱动程序 API 中存在的方法,这可能导致 FileStream.BeginRead 启动的操作在 EndRead 时提前完成叫。“早期”是指在填充整个请求的缓冲区长度之前,没有错误。
用例
出于想象力的考虑,假设文件位于网络共享上,并且网络有时可能会遇到极端的减速,因此触发提前完成通用 1MB 缓冲操作将是实用且最佳的,以便检索在恢复新的 1MB 缓冲操作之前处理几个字节。
这些“几个字节”可用于启动大量计算密集型内存资源的构建,这些资源可以在允许缓冲完成时构建。
关于文档
请注意,BeginRead 的文档没有明确说明异步操作是原子的还是不可中断的。它所提到的是,如果发生“错误”,在调用 EndRead 之前您不会知道它。这并不排除可能发生其他一些不是错误的事件,这会导致 EndRead 返回的字节数少于请求的字节数,无论如何它一直都会这样做。
例如,“文件结束”和“缓冲区已满”可以看作是异步读取操作的两个“自然”中断,这会导致它返回的字节数少于请求的字节数,而不会出错。我正在寻找“人为”中断的可能性,这也会导致 EndRead 在 EOF 之前和缓冲区已满之前成功返回读入缓冲区的字节数。