可以由多个线程访问的方法
本文关键字:访问 方法 线程 | 更新日期: 2023-09-27 18:25:00
我想写一个方法,从不同的线程打开(或创建(如果不存在)文件
在这种情况下,FileAccess
和FileShare
标志是什么?我尝试了FileAccess.Read/Write和FileShare.Read/Wwrite,但没有发现任何差异。我使用以下代码进行了测试,看起来不错,但不确定标志(最后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));
}
}
}
如果多个线程需要写入文件,则需要在文件上使用exclusive lock
。如果可以让一些线程读取文件,而另一些线程写入文件,那么可以使用ReaderWriterLockSlim
。
FileShare
参数用于指示在当前线程中打开句柄时其他线程/进程如何访问该文件。ReadWrite
意味着其他线程将能够从该文件中读取和写入,这显然意味着如果您试图从当前句柄写入该文件,则可能会损坏内容。
因为您只是在阅读,所以应该只指定那个(FileAccess.Read
)。你可以接受别人的阅读,所以说(FileShare.Read
)。
这里有更好的测试代码:
ParallelEnumerable.Range(0, 100000).ForAll(_ => AccessFile());