C# 锁定对象

C# 锁定对象,c#,.net,multithreading,C#,.net,Multithreading,我的班级结构如下 public class Logger { StremWriter sw; public Logger() { sw = new streamwriter(tempPath); } public StreamWriter StreamLog { get { return sw; } } } 如果我尝试从两个不同的线程访问StreamWriter对象,我想知道如何正确锁定。如下所示的锁

我的班级结构如下

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
中,不同的线程可以从中检索它们

如下所示的锁定是否可接受?还是应该锁定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);
    }
}
如下所示的锁定是否可接受?还是应该锁定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);
    }
}

我怀疑你是否有一个
StremWriter
。始终发布准确的代码,先编译,然后复制/粘贴。@HenkHolterman为了简洁起见,我是直接在这里输入的。但我要说的是,它将在将来编译。我怀疑你是否有一个
StremWriter
。始终发布准确的代码,先编译,然后复制/粘贴。@HenkHolterman为了简洁起见,我是直接在这里输入的。但考虑到这一点,它将在将来编译。