我有一个文件要填满,所以我觉得最好同时做。
笔记:
- 我同时从多台计算机获取文件。
- 每次调用 StartWrite 之前,我都会设置位置。-> 每次使用前都必须锁定吗?
是不是很好?你有更好的吗?
顺便说一句, Stream.Flush() 是什么?
谢谢。
原则上这是不安全的,因为即使您的流是线程安全的,您仍然必须非原子地设置位置并写入。
本机 Windows 文件 API 支持这一点,.NET 不支持。Windows 完全能够对同一文件进行并发 IO(如果 Windows 不支持,SQL Server 将如何工作?)。
FileStream
我建议你每个线程只使用一个写作。
不,这在概念上是错误的。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();
}
尝试同时对同一个流执行多个写入操作是没有意义的。
底层系统一次只能写入文件中的一个位置,因此即使异步写入方法支持多线程,写入仍然会被阻塞。
只需定期写入文件,并使用锁定,以便一次只有一个线程写入文件。