1

我有一个类结构如下

public class Logger
{
    StremWriter sw;

    public Logger()
    {
        sw = new streamwriter(tempPath);
    }

    public StreamWriter StreamLog 
   {
        get { return sw; }
    }

}

我想知道如果我尝试StreamWriter从两个不同的线程访问对象,如何正确锁定。如下所示的锁定是否可以接受?StreamWriter或者我应该直接锁定

//Log is an instance of Logger that could be accessed from multiple threads
lock (Log) {
    Log.StreamLog.WriteLine("temp");
}

编辑:这些日志对象将进入ConcurrentQueue不同线程可以检索它们的位置

4

1 回答 1

5

如下所示的锁定是否可以接受?或者我应该直接锁定 StreamWriter

两者都不是特别安全。在您的班级本身中处理此问题会更加安全/可靠。与其将 暴露StreamWriter给外界,不如制作自己的WriteLine方法,并在内部处理锁定。这使得不可能意外避免锁定。

例如,类似:

public class Logger
{
    // Make an object to use for locking
    private readonly object syncObj = new object();

    StremWriter sw;

    public Logger()
    {
        sw = new streamwriter(tempPath);
    }

    public void WriteLine(string textToOutput) 
    {
        lock(syncObj)
            sw.WriteLine(textToOutput);
    }
}
于 2012-09-19T21:23:05.177 回答