Вопрос

Я пытаюсь все упростить.Вот мой код:

    If Threading.Monitor.TryEnter(syncRoot) Then
        Try
            'do something
        Finally
            Threading.Monitor.Exit(syncRoot)
        End Try
    Else
        'do something else
    End If

Это даже хуже, чем ReaderWriterLock с точки зрения шума.Я могу использовать C # или VB, поэтому ответы, относящиеся к любому из них, будут приветствоваться.

Это было полезно?

Решение

Использовать делегата?

Например.

public bool TryEnter(object lockObject, Action work) 
{
    if (Monitor.TryEnter(lockObject)) 
    {
       try 
       {
          work();
       }
       finally 
       {
           Monitor.Exit(lockObject);
       }        
       return true;
     }

     return false;
}

Другие советы

Это очень похоже на ваш последний пост и я бы ожидал аналогичного ответа. Единственное существенное отличие состоит в том, что вы можете возвратить «null» из вашего метода, если тайм-аут не удается - тогда " Dispose () " не вызывается, и вы можете легко проверить значение:

using(var token = GetLock(syncLock, timeout)) {
  if(token != null) { ... }
}

Единственный сбой в том, что вы не обязательно хотите добавлять метод расширения к " объекту " (или даже «T где T: класс») ...

Джон Скит рассматривал это в прошлом - стоит посмотреть .

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top