1

我有一个文件要填满,所以我觉得最好同时做。

笔记:

  1. 我同时从多台计算机获取文件。
  2. 每次调用 StartWrite 之前,我都会设置位置。-> 每次使用前都必须锁定吗?

是不是很好?你有更好的吗?

顺便说一句, Stream.Flush() 是什么?

谢谢。

4

3 回答 3

2

原则上这是不安全的,因为即使您的流是线程安全的,您仍然必须非原子地设置位置并写入。

本机 Windows 文件 API 支持这一点,.NET 不支持。Windows 完全能够对同一文件进行并发 IO(如果 Windows 不支持,SQL Server 将如何工作?)。

FileStream我建议你每个线程只使用一个写作。

于 2012-09-08T15:55:03.510 回答
2

不,这在概念上是错误的。Stream(我假设您的意思是System.IO.Stream类)是一个抽象类。当您实例化一个对象时,您正在使用许多子类之一。

假设关于子类的任何事情都是错误的方法,因为:

a) 有人可能会在您之后对您的代码进行修改,但看不到实际的子类实现是做什么的。b) 不太可能,但实施可能会改变。例如,如果有人在 Mono 框架上安装您的代码怎么办。

如果您使用 FileStream 类,请考虑在FileShare参数设置为 Write的同一个基础文件上创建两个(或更多)FileStream 对象。通过这种方式,您可以指定可能同时写入,但每个流都有自己的位置指针。

更新:直到现在我才看到您的评论“每台计算机都向我发送带有起始索引、结束索引和字节 [] 的部分”。实际上,对于这种情况,多个 FileStream 应该可以正常工作。

    void DataReceived(int start, byte[] data)
    {
        System.IO.FileStream f = new System.IO.FileStream("file.dat", System.IO.FileMode.Open, System.IO.FileAccess.Write, System.IO.FileShare.ReadWrite);
        f.Seek(start, System.IO.SeekOrigin.Begin);
        f.Write(data, start, data.Length);
        f.Close();
    }
于 2012-09-08T15:55:52.997 回答
1

尝试同时对同一个流执行多个写入操作是没有意义的。

底层系统一次只能写入文件中的一个位置,因此即使异步写入方法支持多线程,写入仍然会被阻塞。

只需定期写入文件,并使用锁定,以便一次只有一个线程写入文件。

于 2012-09-08T15:42:32.260 回答