1

私は以下のようなクラス構造を持っています

public class Logger
{
    StremWriter sw;

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

    public StreamWriter StreamLog 
   {
        get { return sw; }
    }

}

StreamWriter2 つの異なるスレッドからオブジェクトにアクセスしようとすると、適切にロックする方法を知りたいです。下図のようなロックでよろしいですか?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 directl をロックする必要があります

どちらも特に安全ではありません。クラス自体でこれを処理する方がはるかに安全/安全です。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 に答える