Вы можете периодически проверять количество элементов в очереди, а когда количество элементов больше нуля, вы подаете сигнал, например, с помощью. ManualResetEvent для потока, который удаляет элементы из очереди до тех пор, пока очередь не станет пустой.
Вот псевдокод для этого:
Проверка темы:
while(true)
{
int QueueLength = 0;
lock(Queue)
{
queueLength = Queue.Length;
}
if (Queue.Length > 0)
{
manualResetEvent.Set();
}
else
{
Thread.Sleep(...);
}
}
Тема очереди:
while(true)
{
if(manualResetEvent.WaitOne(timeout))
{
DequeueUntilQueueEmpty();
}
}
Также рассмотрите возможность использования блокировки в DequeueUntilQueueEmpty.