我有一个文件要填满,所以我想知道同时做是否更好。
注意:
- 我同时从多台计算机获取文件
- 每次调用StartWrite之前,我都会设置位置。->每次使用前我都必须把它锁上吗
这是好生气吗?你有更好的吗?
顺便问一句,Stream.Flush()是什么?
谢谢。
假设任何关于子类的东西都是错误的方法,因为:
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
。
尝试同时对同一流执行多个写操作是毫无意义的。
底层系统一次只能写入文件中的一个位置,因此即使异步写入方法支持多线程,写入仍然会被阻止。
只需定期写入文件,并使用锁定,这样一次只有一个线程写入文件。