【发布时间】:2014-06-24 03:07:10
【问题描述】:
是否同时使用FileStream 类写入文件和.NET File.Copy 方法复制文件线程安全?操作系统似乎应该安全地处理对文件的并发访问,但我找不到任何关于此的文档。我编写了一个简单的应用程序进行测试,并且看到了奇怪的结果。该文件的副本显示为 2MB,但是当我使用 notepad++ 检查文件内容时,里面是空的。原始文件包含数据。
using System;
using System.Threading.Tasks;
using System.Threading;
using System.IO;
namespace ConsoleApplication
{
class Program
{
static void Main(string[] args)
{
string filePath = Environment.CurrentDirectory + @"\test.txt";
using (FileStream fileStream = new FileStream(filePath, FileMode.Create, FileAccess.ReadWrite))
{
Task fileWriteTask = Task.Run(() =>
{
for (int i = 0; i < 10000000; i++)
{
fileStream.WriteByte((Byte)i);
}
});
Thread.Sleep(50);
File.Copy(filePath, filePath + ".copy", true);
fileWriteTask.Wait();
}
}
}
}
感谢您的帮助!
【问题讨论】:
-
我不确定这个问题中是否有任何与 C# 相关的内容 - 这似乎更多地是关于 Windows API 如何处理共享读/写操作。
-
旁注:用文本编辑器检查二进制文件的内容不是最好的检查,请确保以二进制模式打开。
-
您要解决的更大问题是什么?很明显,您拥有的代码无法正常工作。
-
请注意,除非文件的副本与原始文件位于不同的物理硬盘驱动器上,否则尝试同时写入两个文件将显着减少磁盘写入速度(因为它需要在每个文件的扇区之间移动磁盘头)并且由于这个过程几乎肯定会受到 IO 限制,而不是 CPU 限制,因此 CPU 并发不会为您带来任何好处。简而言之,您应该会看到 在此处仅使用一个线程,从而显着提高了速度。
-
我的建议是关闭这个问题并提出一个新问题,详细解释你想要做什么。
标签: c# .net multithreading