Я пытаюсь использовать шаблон производителя для обработки и сохранения некоторых данных. Я использую AutoResetEvent для сигнализации между двумя therads здесь это код у меня естьПотребитель-производитель с AutoResetEvent
Здесь функция производитель
public Results[] Evaluate()
{
processingComplete = false;
resultQueue.Clear();
for (int i = 0; i < data.Length; ++i)
{
if (saveThread.ThreadState == ThreadState.Unstarted)
saveThread.Start();
//-....
//Process data
//
lock (lockobject)
{
resultQueue.Enqueue(result);
}
signal.Set();
}
processingComplete = true;
}
А вот функция потребительского
private void SaveResults()
{
Model dataAccess = new Model();
while (!processingComplete || resultQueue.Count > 0)
{
if (resultQueue.Count == 0)
signal.WaitOne();
ModelResults result;
lock (lockobject)
{
result = resultQueue.Dequeue();
}
dataAccess.Save(result);
}
SaveCompleteSignal.Set();
}
Так что мой вопрос иногда resultQueue.Dequeue() выдает исключение InvalidOperation, потому что очередь пуста. Я не уверен, что я делаю неправильно, не должен сигнал signal.WaitOne(), который блокирует очередь пустым?