Re[2]: Синхронизация очереди
От: DartVader  
Дата: 03.05.07 16:30
Оценка:
Здравствуйте, desco, Вы писали:

>можно сделать как-то так: (оригинальный вариант встретил, по-моему, в блоге Джо Даффи)


Да, очевидно, это правильный вариант той идеи, что использую я.

Мой плохой кусок:
Monitor.Enter(workerLock);
if (queue.Count > 0)
{
    int val = queue.Dequeue();
    Monitor.Exit(workerLock);

    // Some long-time operation...
    Thread.Sleep(100);
    Console.WriteLine("Done: {0}   {1} left", val, cnt);
}
else
{
    Monitor.Wait(workerLock);
    Monitor.Exit(workerLock);
}



Правильная запись:
     lock(_queueSyncRoot) 
     {
         if (_queue.Count == 0)
         {
             Monitor.Wait(_queueSyncRoot);
         }
         item = _queue.Dequeue();
    }
    //Some long-time operation
    Thread.Sleep(100);
    Console.WriteLine("Done: {0}   {1} left", val, cnt);


Все оказалось просто — достаточно поменять местами проверки Но я знал, что как-то так оно и должно быть.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.