私にはプロデューサーとコンシューマーの2つのスレッドがあります。
プロデューサーは常に何かを生産しているとは限りません。ただし、消費者は、利用可能になり次第、消費する必要があります。
プロデューサースレッドはループで動作し、結果をに入れますConcurrentQueue
。コンシューマースレッドは、システムが無効になったときにwhile (!disposing)
呼び出すループにあります。メソッドがfalseを返す場合にもAutoResetEvent.WaitOne
呼び出すことを検討しました。これは、キューにアイテムが残っていない場合にのみ発生するはずです。AutoResetEvent.WaitOne
ConcurrentQueue.TryDequeue
ただし、これを行うと、次の実行が行われたときにデッドロックが発生する可能性があります。
- エンキュー
- TryDequeueはtrueを返します
- TryDequeueはfalseを返します
- エンキュー
- WaitOne
これは、このスニペットの可能性です。
while (this.isDisposing == 0)
{
if (this.isEnabled == 0)
{
this.signal.WaitOne();
}
object item;
if (!this.queue.TryDequeue(out item))
{
this.signal.WaitOne();
continue;
}
this.HandleItem(item);
}
ロックを使用せずにこれを行う適切な方法は何ですか?