C#多个线程同时写入同一文件

13

我有一个多线程应用程序,它在特定事件上写入同一文件。如何锁定该文件并使线程等待直到其可用?由于其他线程(无法访问)会引发异常,因此我无法使用FileStream

FileStream fileStream = new FileStream(file, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.Read);

有没有适当的方法来做这件事?


1
可能是使用多个线程在单个文件中编写的重复问题。 - user5158149
1个回答

14

您需要一个线程安全的文件写入器来管理线程。您可以使用 ReaderWriterLockSlim 来实现。

public class FileWriter
{
    private static ReaderWriterLockSlim lock_ = new ReaderWriterLockSlim();
    public void WriteData(string dataWh,string filePath)
    {
        lock_.EnterWriteLock();
        try
        {
            using (var fs = new FileStream(filePath, FileMode.OpenOrCreate, FileAccess.ReadWrite))
            {
                byte[] dataAsByteArray = new UTF8Encoding(true).GetBytes(dataWh);
                fs.Write(dataAsByteArray, 0, dataWh.Length);
            }
        }
        finally
        {
            lock_.ExitWriteLock();
        }
    }
}

例子:

Parallel.For(0, 100, new ParallelOptions { MaxDegreeOfParallelism = 10 },i =>
{
   new FileWriter().WriteData("Sample Data", Path.Combine(AppDomain.CurrentDomain.BaseDirectory,"SampleFile.txt"));
});

我必须在 GetBytes 行之前添加 fs.Seek(0, System.IO.SeekOrigin.End); 以防止代码覆盖文本。 - Ryan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接