并行使用多个Stream.BeginWrite是否线程安全



我有一个文件要填满,所以我想知道同时做是否更好。

注意:

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

这是好生气吗?你有更好的吗?

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

谢谢。

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

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

a) 有些人可能会来找你,对你的代码进行修改,却看不到实际的子类实现的作用。b) 可能性较小,但实施可能会发生变化。例如,如果有人将您的代码安装在Mono框架上,该怎么办。

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

更新:直到现在我才看到你的评论"每台电脑都给我发一个带有开始索引、结束索引和字节[]的部分"。实际上,对于这种情况,多个FileStreams应该可以正常工作。

    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();
    }

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

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

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

尝试同时对同一流执行多个写操作是毫无意义的。

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

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

相关内容

  • 没有找到相关文章

最新更新