c#多个线程写入同一个文件

时间:2017-12-02 14:31:58

标签: c#

我有一个多线程应用程序,它在特定的事件上写入同一个文件。 我如何锁定文件并让线程等到它空闲? 我不能使用FileStream因为它会在其他线程上抛出异常(无法访问)

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

有没有正确的方法呢?

1 个答案:

答案 0 :(得分:2)

您需要一个线程安全的文件编写器来管理线程。您可以使用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"));
});