2015-07-02 3 views
1

Я получаю исключение SynchronizationLockException внутри блокировки мьютекса при попытке вызвать Monitor.Wait (объект). Что я должен изменить?SynchronizationLockException с использованием мьютексов

static Mutex mutex; 
static readonly object monitorKey; 
condition = true; 
mutex.WaitOne(); 
     try 
     { 
      while (condition) 
      { 
       Monitor.Wait(monitorKey); // exception is thrown 
      } 
      isAnyoneWriting = true;   
     } 
     finally 
     { 
      mutex.ReleaseMutex(); 
     } 

ответ

2

Вам нужно присвоить значение (new object();) для monitorKey по созданию (поскольку это статический и только для чтения).

После этого, вы должны получить блокировку перед ожиданием на ней:

while (condition) 
{ 
    lock(monitorKey) 
    { 
     Monitor.Wait(monitorKey); // exception is thrown 
    } 
} 

Или вы могли бы изменить порядок и иметь замок окружает время, чтобы избежать ненужной блокировки -> циклов выхода.

+0

Прошу прощения, я забыл присваивания, поскольку у меня есть они внутри конструктора. Вы случайно не знаете, почему мьютексы не работают как блокировка в этом случае? – PacoDePaco

+0

Если вы назначили значение 'monitorKey' в своем конструкторе, это нормально. Что касается мьютекса, это не имеет ничего общего с проблемой или решением. Как я писал, * вы должны приобрести блокировку, прежде чем ждать на ней *. Это означает блокировку объекта, который вы планируете ждать. Именно так определяется API. – Amit

+0

Большое спасибо, вы спасли меня от катастрофы;] – PacoDePaco

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