我想使用生产者消费者模式来处理和保存一些数据。我使用的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异常,因为Queue是空的。我不知道我做错了什么不应该signal.WaitOne()上面那个块队列是空的?