Как бы вы просто Monitor.TryEnter

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

    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, поэтому ответы, относящиеся к любому из них, будут приветствоваться.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
4 164
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

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

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

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

Передача возможного нуля в блок using - изящный трюк. Но мне это все еще кажется бессмысленным.

Jonathan Allen 04.10.2008 13:50
Ответ принят как подходящий

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

Например.

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

     return false;
}

Совершенно бесполезен для VB (без анонимных делегатов Action), но я вижу, что он работает с C#. Можете показать, как вы это предвидите?

Jonathan Allen 04.10.2008 15:14

Простейшим будет лямбда: TryEnter (obj, () => {... code ...})), где возврат сообщает вам, было ли это сделано или нет.

Marc Gravell 04.10.2008 15:56

Теперь, когда в VB 10 есть анонимные делегаты, это мое любимое решение.

Jonathan Allen 19.05.2010 09:26

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