我们有一个 20 GB 的文件,我们想以随机偏移量从中读取数据,因此它不是顺序读取。我打算使用异步 IO,但是我注意到了这个限制——
正如我所说,我的要求是以随机偏移量读取。但是 BeginRead API 不会在文件中使用偏移量,它只会在正在读取的缓冲区中使用偏移量 (http://msdn.microsoft.com/en-us/library/zxt5ahzw)
所以我唯一的选择是使用 FileStream.Seek 。但是,问题在于如果我使用的是异步 IO
FileStream fs = Foo.txt 被两个线程使用
Thread 1 Thread 2
fs.Seek(offset1)
(Thread 1 gets preempted)
fs.Seek(offset2)
fs.BeginRead
fs.BeginRead
如您所见,如果线程 1 在 Seek 到偏移 1 之后被抢占,那么线程 1 最终会从 offset2 读取,这不是本意。
这是否意味着我必须使用锁?这会破坏异步 IO 的目的。