我想编写一个方法来打开(或创建,如果它不存在)来自不同线程的文件
在这种情况下,FileAccess
和FileShare
标志是什么?我尝试了FileAccess.Read/Write和FileShare.Read/Write,但没有看到任何差异。我使用以下代码进行测试,看起来很好但不确定标志(最后2个)
任何人都可以澄清我应该使用FileAccess.ReadWrite
或FileAccess.Read
以及FileShare.ReadWrite
还是FileShare.Read
?
class Program
{
static void Main(string[] args)
{
Task first = Task.Run(() => AccessFile());
Task second = Task.Run(() => AccessFile());
Task third = Task.Run(() => AccessFile());
Task fourth = Task.Run(() => AccessFile());
Task.WaitAll(first, second, third, fourth);
Task[] tasks = new Task[100];
for (int i = 0; i < 100; i++)
{
tasks[i] = Task.Run(() => AccessFile());
}
Task.WaitAll(tasks);
}
public static void AccessFile()
{
string path = @"c:\temp\test.txt";
// FileShare.Write gives access violation
using (FileStream fs = File.Open(path, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite))
{
byte[] by = new byte[100];
fs.Read(by, 0, 100);
Console.WriteLine(Encoding.ASCII.GetString(by));
}
}
}
答案 0 :(得分:0)
如果多个线程需要写入文件,那么你需要一个exclusive lock
。如果您可以读取某些线程而其他人写入该文件,则可以使用ReaderWriterLockSlim
。
FileShare
参数用于指示在当前线程中打开句柄时其他线程/进程如何访问该文件。 ReadWrite
表示其他线程将能够从该文件读取和写入,这显然意味着如果您尝试从当前句柄写入文件,您可能会损坏内容。
答案 1 :(得分:0)
由于您只是在阅读,所以应该只指定(FileAccess.Read
)。你可以和其他人一起阅读(FileShare.Read
)。
这里有更好的测试代码:
ParallelEnumerable.Range(0, 100000).ForAll(_ => AccessFile());