私は現在、単一のスレッドに対して複数のスレッドが何かをスレッドマネージャのキューに追加するのを待つためにManualResetEventを使用しています。スレッドマネージャが手動リセットイベントを使用して信号を受信すると、スレッドマネージャは追加されたアイテムをデキューし、さらに処理を行います。私の唯一の問題は、複数のセットがトリガーされている場合、他のキューアイテムは処理されないということです。ManualResetEventのサイズは、複数のスレッドを待機するのに十分なチェックですか?
while (IsThreadRunning)
{
// A: My workaround is to check if queue has item, if not then wait for other thread to set the event
if (DataQueue.Count <= 0)
{
ResetEvent.WaitOne();
}
// B: At this point two thread added item to the queue and did ResetEvent.Set() twice.
if (DataQueue.Count > 0)
{
DataQueue.Dequeue();
}
// Reset the event to avoid processor hog
ResetEvent.Reset();
}
(点Bを参照)、ここに私の問題を回避するには、ポイント上のキューサイズの条件を追加することです。 これを実行してデッドロックを回避する別の方法はありますか?
Note:ManualResetEventの使用例に示す通常のシナリオでは、1つのスレッドのイベントに対して複数のスレッド待機(ManualResetEvent.Wait)がありますが、ここでは複数のスレッドによってイベントがトリガーされます(ManualResetEvent.Set)。このシナリオで使用される他のクラスはありますか?
ちょっと変えてみてはいかがですか? –