Skip to main content
 首页 » 编程设计

c#之锁定对象

2024年02月02日32小虾米

我的类结构如下

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

请您参考如下方法:

Is the locking as shown below acceptable? Or should I lock the StreamWriter directl

两者都不是特别安全。在您的类(class)本身中处理此问题会更加安全/可靠。不要将 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); 
    } 
}