2013-04-03 2 views
0

Мне кажется, что я могу изобретать колесо здесь. Вот что я пытаюсь достичь:Уведомление о включении/высвобождении монитора

Когда объект заблокирован с использованием lock или Monitor.Enter, я хотел бы получать уведомление. Аналогично, когда объект освобожден, я хотел бы получить уведомление.

Я думаю о написании класса оболочки, который предоставляет наблюдаемые для отправки уведомлений, а также несколько методов для получения/освобождения блокировки. Но, как я уже упоминал, я чувствую, что могу переделать то, что уже существует. Любые методы .NET, которые я мог бы использовать для достижения этого, написав новый класс?

EDIT: Чтобы ответить на некоторые вопросы: Почему? Мне нужно знать, когда часть кода занята, прежде чем пытаться выполнить. Предположим, что у нас есть две кнопки в пользовательском интерфейсе, A и B. Выполняется методA, а B выполняет методB. Они оба используют один и тот же объект для блокировки/синхронизации. Я хотел бы отключить эти кнопки, когда вижу, что кто-то уже выполняет кусок кода, который заблокирован экземпляром объекта sync _syncObject. Я хотел бы дать пользователю указание, что функция не может быть выполнена в данный момент.

Monitor.TryEnter или попытка проверить, доступен ли замок, не является решением, поскольку он требует опроса и не является уведомлением.

void methodA() 
{ 
lock(_syncObject) 
{ 
... 
} 
} 

void methodB() 
{ 
{ 
lock(_syncObject) 
{ 
... 
} 
} 
+0

Я так не считаю. –

+1

Вы, вероятно, не захотели бы, даже если бы могли. Скорее всего, у вас есть проблема с вашим дизайном, если вы хотите это сделать. – Servy

+2

Почему вы пытаетесь это сделать? Это точно не встроено. Может быть, мы сможем лучше ответить, если узнаем «почему». – usr

ответ

0

Непонятно, что вы пытаетесь сделать. Если вы хотите получить уведомление о том, что какой-либо поток выполняет защищенный раздел кода, , вы можете создать набор событий, поэтому, как только начнется раздел кода, вы можете запустить событие, в котором выполняется код ... То же самое в конце , незадолго до освобождения блокировки.

+0

Я уже думал о чем-то подобном, теперь предположим, что этот экземпляр объекта блокировки используется в нескольких местах, теперь мне придется добавить это событие во все эти места. – LadderLogic

0

Единственное «уведомление», которое вы получите, - это то, что Monitor заблокирован или что он разблокирован. Например:

bool lockTaken; 
    Monitor.Enter(lockObject, ref lockTaken); 
    if(!lockTaken) Console.WriteLine("Already locked"); 
    else Console.WriteLine("Not already locked."); 

Мониторы и другие объекты синхронизации предназначены для управления потоками, а не для уведомления. Если вам требуется уведомление о происходящих событиях, создайте события и поднимите их - для чего нужны события.

+0

Мне известны события. Благодаря! – LadderLogic

Смежные вопросы