2012-01-04 47 views
3

我使用的鎖定對象寫這樣一個集目前正在做我同步:命名在C#中的同步對象爲使用爭分析

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

enqueueLockObject是班上一個private object。我有幾個這樣的消息是由不同的功能單元的不同線程排隊。在爭用資源管理器中,我可以看到線程打到鎖,但鎖都有名稱,如Handle18

Contention

是否有可能命名的鎖,所以我可以更容易地識別它們呢?

+0

IIRC喬恩斯基特具有用於MiscUtil名爲鎖的包裝:看http://www.yoda.arachsys.com/csharp/miscutil/usage/locking.html – 2012-01-04 14:57:27

回答

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

感謝奧萊克西,我只是想我可能會錯過一些明顯的東西。我喜歡你的解決方案,它對我來說似乎很優雅! – EdWaugh 2012-01-05 11:09:11