私のアプリケーションには数年前から次のコードが含まれていますが、問題が発生したことはありません。
while ((PendingOrders.Count > 0) || (WaitHandle.WaitAny(CommandEventArr) != 1))
{
lock (PendingOrders)
{
if (PendingOrders.Count > 0)
{
fbo = PendingOrders.Dequeue();
}
else
{
fbo = null;
}
}
// Do Some Work if fbo is != null
}
CommandEventArrは、NewOrderEvent(自動リセットイベント)とExitEvent(手動リセットイベント)で構成されています。
しかし、これがスレッドセーフかどうかはわかりません(エンキューする前にすべてキューをロックするN個のプロデューサースレッドと、上記のコードを実行する1つのコンシューマースレッドを想定しています)。また、Queue.Countプロパティは、Queueクラスから1つのインスタンスInt32値を返すだけであると想定できます(揮発性、インターロック、ロックなどはありません)。
これを修正し、上記のコードで実行しようとしていることを実行するために、キューとAutoResetEventで使用される通常のパターンは何ですか?
(Queue.Countは何でも実行でき、その実装に固有であることが正しく指摘された後、質問を少し変更するように編集されました)。