2012-01-04 6 views
3

で使用するためにC#で同期オブジェクトを命名:enqueueLockObjectはクラスでprivate objectある私は現在、このようなコレクションへの書き込みをロックオブジェクトを使用して、私の同期をやっている競合分析

private void WSMessageEnqueue(object sender, MessageClass message) 
    { 
     if (isDisconnecting == true) return; 
     lock (enqueueLockObject) 
     { 
      incomingMessageQueue.Enqueue(message); 
     } 
    } 

。私はメッセージが異なる機能単位の異なるスレッドによってエンキューされるので、これらのいくつかを持っています。競合エクスプローラでは、スレッドにロックが当たっているのがわかりますが、ロックの名前はすべてHandle18です。

Contention

それは私がより簡単に識別できるように、ロックに名前を付けることは可能ですか?

+0

IIRCジョンスキートはMiscUtilで名前のロックのラッパーを持っていますhttp://www.yoda.arachsys.com/csharp/miscutil/usage/locking.html –

答えて

4

c#で使用できる名前付きロックはありません。 named mutexを試してみることもできますが、一般にMonitor.Enter/Monitor.Exitよりもはるかに遅いです。

Markによって提供されたlinkをご覧ください。または、独自のクラスを作成することもできます。基本的な実装は次のようになります。

public class NamedSyncRoot 
{ 
    private object _syncRoot; 

    public string Name { get; private set; } 

    public NamedSyncRoot(string name) 
    { 
     Name = name; 
     _syncRoot = new object(); 
    } 

    public void Lock() 
    { 
     Monitor.Enter(_syncRoot); 
    } 

    public void Unlock() 
    { 
     Monitor.Exit(_syncRoot); 
    } 
} 

public class Foo 
{ 
    private static NamedSyncRoot namedLock = new NamedSyncRoot("Foo"); 

    public void Bar() 
    { 
     namedLock.Lock(); 
     //... 
     namedLock.Unlock(); 
    } 
} 
+0

ありがとうoleksiiを参照してください、私はちょうど私が何かが明らかでないかもしれないと思った。私はあなたのソリューションが好きです、それは私にとって非常にエレガントなようです! – EdWaugh

関連する問題