写入文件系统。如何有效锁定

时间:2014-05-08 15:48:10

标签: c# multithreading filesystems locking

我正在写Stringbuilder到文件

   using (FileStream file = new FileStream(Filepath, FileMode.Append, FileAccess.Write, FileShare.Read))
   using (StreamWriter writer = new StreamWriter(file, Encoding.Unicode))
   {
        writer.Write(text.ToString());
   }

这是等效的(我认为)

   File.AppendAllText(Filepath, text.ToString());

显然,在多线程环境中,这些语句本身会导致在碰撞时写入失败。 我已经在此代码上加了lock,但这并不理想,因为它过于昂贵而且可能会加剧这个瓶颈。是否有其他方法导致一个线程文件访问阻止另一个线程。我被告知"阻止不锁定",我认为lock确实阻止了,但他们必须暗示以更便宜的方式阻止同时使用文件系统。

如何以较便宜的方式阻止执行?

2 个答案:

答案 0 :(得分:3)

您不能让多个线程同时写入同一个文件,因此,没有这样的“瓶颈”。 lock对于这种情况非常有意义。如果您担心这很昂贵,只需将写入添加到队列中,让单个线程管理将它们写入文件。

伪代码

public static readonly Object logsLock = new Object();

// any thread
lock(logsLock) 
{
    logs.Add(stringBuilderText);
}

// dedicated thread to writing
lock(logsLock)
{
    // ideally, this should be a "get in, get out" situation, 
    // where you only need to make a copy of the logs, then exit the lock, 
    // then write them, then lock the logsLock again, and remove only the logs 
    // you successfully wrote to to file, then exit the lock again.
    logs.ForEach(writeLogToFile);
}

答案 1 :(得分:1)