C# 方法,该方法可由多个线程访问

C# 方法,该方法可由多个线程访问,c#,multithreading,C#,Multithreading,我想编写一个方法来打开(或创建,如果它不存在)来自不同线程的文件。 在这种情况下,FileAccess和FileShare标志是什么?我尝试了FileAccess.Read/Write和FileShare.Read/Write,但没有发现任何差异。我使用以下代码进行测试,看起来不错,但不确定标志(最后2个)。 有谁能澄清我应该使用FileAccess.ReadWrite还是FileAccess.Read和FileShare.ReadWrite还是FileShare.Read class Prog

我想编写一个方法来打开(或创建,如果它不存在)来自不同线程的文件。
在这种情况下,
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));
        }
    }
}
类程序
{
静态void Main(字符串[]参数)
{
Task first=Task.Run(()=>AccessFile());
Task second=Task.Run(()=>AccessFile());
Task third=Task.Run(()=>AccessFile());
Task fourth=Task.Run(()=>AccessFile());
Task.WaitAll(第一、第二、第三、第四);
任务[]任务=新任务[100];
对于(int i=0;i<100;i++)
{
tasks[i]=Task.Run(()=>AccessFile());
}
Task.WaitAll(任务);
}
公共静态void AccessFile()
{
字符串路径=@“c:\temp\test.txt”;
//写入会导致访问冲突
使用(FileStream fs=File.Open(路径,FileMode.OpenOrCreate,FileAccess.ReadWrite,FileShare.ReadWrite))
{
byte[]by=新字节[100];
财政司司长读(由,0,100);
WriteLine(Encoding.ASCII.GetString(by));
}
}
}

如果多个线程需要写入文件,则需要在其上添加一个。如果可以让一些线程读取文件,另一些线程写入文件,则可以使用


FileShare
参数用于指示在当前线程中打开句柄时其他线程/进程如何访问文件
ReadWrite
意味着其他线程将能够从该文件读写,这显然意味着如果您试图从当前句柄写入该文件,则可能会损坏该文件的内容。

如果多个线程需要写入该文件,则需要对其进行修改。如果可以让一些线程读取文件,另一些线程写入文件,则可以使用


FileShare
参数用于指示在当前线程中打开句柄时其他线程/进程如何访问文件
ReadWrite
意味着其他线程将能够从该文件读写,这显然意味着如果您试图从当前句柄写入该文件,则可能会损坏该文件的内容。

由于您仅在读取,因此应指定(
FileAccess.read
)。你可以接受其他人的阅读,所以说(
FileShare.Read

下面是更好的测试代码:

ParallelEnumerable.Range(0, 100000).ForAll(_ => AccessFile());

因为您只是在阅读,所以应该只指定(
FileAccess.Read
)。你可以接受其他人的阅读,所以说(
FileShare.Read

下面是更好的测试代码:

ParallelEnumerable.Range(0, 100000).ForAll(_ => AccessFile());

当两个线程试图同时写入同一文件时,您认为会发生什么情况?你的代码本质上不是线程安全的。在AccessFile中添加locker,这样一次只有一个线程可以在文件中写入,并且你的函数可以从任何线程调用。你是对的,我知道你的意思。这是一个测试方法,我试图理解这个场景中的最后两个参数。此方法将仅读取此方法的“不写入”选项。当两个线程同时尝试写入同一文件时,您认为会发生什么情况?你的代码本质上不是线程安全的。在AccessFile中添加locker,这样一次只有一个线程可以在文件中写入,并且你的函数可以从任何线程调用。你是对的,我知道你的意思。这是一个测试方法,我试图理解这个场景中的最后两个参数。此方法将仅读取此方法的“不写入”选项。