并行使用多个Stream.BeginWrite是否安全可靠?

时间:2012-09-08 15:08:22

标签: c# stream

我有一个即将填写的文件,所以我认为如果它能同时做到更好。

备注:

  1. 我同时从多台计算机上获取文件。
  2. 我每次都调用StartWrite来设置位置。 - >每次使用它时我是否必须锁定它?
  3. 这是好事吗?你有更好的吗?

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

    感谢。

3 个答案:

答案 0 :(得分:2)

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

本机Windows文件API支持此功能,而.NET则不支持。 Windows完全能够并发IO到同一个文件(如果Windows不支持这个,SQL Server将如何工作?)。

我建议您每个帖子只使用一个FileStream

答案 1 :(得分: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();
    }

答案 2 :(得分:1)

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

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

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