일부 데이터를 처리하고 저장하기 위해 생산자 소비자 패턴을 사용하려고합니다. 내가 여기에 두 therads 사이에 신호를위한 AutoResetEvent를 사용하고 여기생산자 소비자 AutoResetEvent를 사용하여
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();
}
그래서 내 문제는 소비자 함수 내가 여기
이 생산자 기능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;
}
코드입니다 그리고 때로는 resultQueue.Dequeue()가 Queue가 비어있어 InvalidOperation 예외를 throw합니다. 내가 잘못하고있는 것이 확실하지 않다. 그 블록 위의 신호. 대기열()은 대기열이 비어 있지 않은가?