C# 在被另一个线程追加的同时读取文件

C# 在被另一个线程追加的同时读取文件,c#,file,file-io,C#,File,File Io,我用的是C#。 为了说明我的问题,我将其简化为WinForms桌面应用程序上的两个计时器 第一个计时器随机选择一个现有的文本文件,打开它进行附加,并在其末尾写入一个字符串。然后将其关闭。 这个过程每隔几毫秒(大约)重复调用一次 另一个计时器也会随机选择一个文件并尝试读取它。 这个过程也被每毫秒重复调用一次 最后,同一个文件被两个定时器寻址,我得到一个锁定错误 现在,我使用以下代码行附加到文件: using (FileStream stream = new FileStream(_

我用的是C#。 为了说明我的问题,我将其简化为WinForms桌面应用程序上的两个计时器

第一个计时器随机选择一个现有的文本文件,打开它进行附加,并在其末尾写入一个字符串。然后将其关闭。
这个过程每隔几毫秒(大约)重复调用一次

另一个计时器也会随机选择一个文件并尝试读取它。 这个过程也被每毫秒重复调用一次

最后,同一个文件被两个定时器寻址,我得到一个锁定错误

现在,我使用以下代码行附加到文件:

        using (FileStream stream = new FileStream(_folder + "\\manifest.log", FileMode.Append, FileAccess.Write, FileShare.ReadWrite))
        {
            TextWriter newWriter = new StreamWriter(stream);
            newWriter.WriteLine(_timestamp);
            newWriter.Flush();
            newWriter.Close();
        }
        using (var fs = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite, 0x1000, FileOptions.SequentialScan))
        using (var sr = new StreamReader(fs, Encoding.UTF8))
        {
            string line;
            while ((line = sr.ReadLine()) != null)
            {
                yield return line;
            }
        }
我使用以下代码行读取文件:

        using (FileStream stream = new FileStream(_folder + "\\manifest.log", FileMode.Append, FileAccess.Write, FileShare.ReadWrite))
        {
            TextWriter newWriter = new StreamWriter(stream);
            newWriter.WriteLine(_timestamp);
            newWriter.Flush();
            newWriter.Close();
        }
        using (var fs = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite, 0x1000, FileOptions.SequentialScan))
        using (var sr = new StreamReader(fs, Encoding.UTF8))
        {
            string line;
            while ((line = sr.ReadLine()) != null)
            {
                yield return line;
            }
        }
共享访问的问题是,如果使用“附加”,它似乎不起作用。
锁定文件的问题是,我无法事先知道它将锁定哪个文件,因为它们是随机选择的

在重新设计我的代码之前,我想我会看看是否有人对如何解决这个问题有一个聪明的想法


谢谢

在您的编写器代码中,使用FileShare.Read打开,在您的阅读器中可以使用FileShare.ReadWrite


你试过简化你的考试吗。只需创建两个Filestreams实例。1执行写操作,然后在保持文件打开的同时创建第二个文件流,对同一文件执行读操作。然后,您可以验证您的共享是否正确。

在编写器代码中,使用FileShare.Read打开,在您的阅读器中,可以使用FileShare.ReadWrite


你试过简化你的考试吗。只需创建两个Filestreams实例。1执行写操作,然后在保持文件打开的同时创建第二个文件流,对同一文件执行读操作。然后您可以验证您的共享是否正确。

早上好,我应该在发布之前检查我的代码!我有文件共享。读取设置为文件共享。写入。-我真是个笨蛋!不要自责,你问了一个合理的问题早上好,我应该在发帖前检查我的代码!我有文件共享。读取设置为文件共享。写入。-我真是个笨蛋!别自责,你问的问题是合理的