Здравствуйте, 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);
Все оказалось просто — достаточно поменять местами проверки

Но я знал, что как-то так оно и должно быть.