可以由多个线程访问的方法

本文关键字:访问 方法 线程 | 更新日期: 2023-09-27 18:25:00

我想写一个方法,从不同的线程打开(或创建(如果不存在)文件
在这种情况下,FileAccessFileShare标志是什么?我尝试了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());