我正在尝试使用生产者消费者模式来处理和保存一些数据。我正在使用 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() 上面的信号吗?