多个线程

时间:2015-11-29 13:23:56

标签: c# multithreading

我想编写一个方法来打开(或创建,如果它不存在)来自不同线程的文件 在这种情况下,FileAccessFileShare标志是什么?我尝试了FileAccess.Read/Write和FileShare.Read/Write,但没有看到任何差异。我使用以下代码进行测试,看起来很好但不确定标志(最后2个) 任何人都可以澄清我应该使用FileAccess.ReadWriteFileAccess.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));
        }
    }
}

2 个答案:

答案 0 :(得分:0)

如果多个线程需要写入文件,那么你需要一个exclusive lock。如果您可以读取某些线程而其他人写入该文件,则可以使用ReaderWriterLockSlim

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

答案 1 :(得分:0)

由于您只是在阅读,所以应该只指定(FileAccess.Read)。你可以和其他人一起阅读(FileShare.Read)。

这里有更好的测试代码:

ParallelEnumerable.Range(0, 100000).ForAll(_ => AccessFile());
相关问题