В настоящее время я использую ManualResetEvent для одного потока, чтобы дождаться, пока несколько потоков добавят что-либо в очередь диспетчера потоков.Если диспетчер потоков получает сигнал с использованием события ручного сброса, он удаляет добавленный элемент и выполняет дальнейшую обработку.Моя единственная проблема заключается в том, что если сработало несколько наборов, то другой элемент очереди не будет обработан.(см. точка B )
while (IsThreadRunning)
{
// A: My workaround is to check if queue has item, if not then wait for other thread to set the event
if (DataQueue.Count <= 0)
{
ResetEvent.WaitOne();
}
// B: At this point two thread added item to the queue and did ResetEvent.Set() twice.
if (DataQueue.Count > 0)
{
DataQueue.Dequeue();
}
// Reset the event to avoid processor hog
ResetEvent.Reset();
}
Мой обходной путь здесь заключается в добавлении условия размера очереди в точку A .Есть ли другой способ сделать это, чтобы избежать взаимоблокировки?
Примечание. Обычный сценарий, приведенный в примере использования ManualResetEvent, состоит в том, что существует несколько потоков, ожидающих (ManualResetEvent.Wait) для события в одном потоке, ноздесь несколько потоков запускает (ManualResetEvent.Set) событие.Есть ли другой класс, который используется для этого сценария?