Наименование объекта синхронизации в c # для использования с анализом конфликтов - PullRequest
3 голосов
/ 04 января 2012

В настоящее время я выполняю синхронизацию, используя блокирующий объект для записи в коллекцию, подобную этой:

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

Где enqueueLockObject - это private object в классе. У меня есть несколько из них, поскольку сообщения помещаются в разные потоки для разных функциональных блоков. В обозревателе конфликтов я вижу потоки, блокирующие блокировки, но все блокировки имеют имена, такие как Handle18.

Contention

Можно ли назвать замки, чтобы мне было легче их идентифицировать?

1 Ответ

4 голосов
/ 04 января 2012

В c # нет именованной блокировки. Вы можете попробовать использовать с именем mutex , но обычно он намного медленнее, чем Monitor.Enter / Monitor.Exit.

Взгляните на ссылку , предоставленную Марком, или вы можете написать свой класс. Базовая реализация может выглядеть так:

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();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...