生産者/消費者パターンを使用して、一部のデータを処理および保存しようとしています。私は2つのtherad間のシグナリングに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例外をスローすることです。何が間違っているのかわからないので、シグナルを送信するべきではありません。そのブロックの上のWaitOne()は、キューが空ですか?