私は消費者とプロバイダスレッドとキューを持つC#コンソールアプリケーションを持っています。消費者は永続的なループに陥っており、それは手作業によって回避されます。プロバイダスレッドは、オブジェクトを待ち行列に入れ、手動で障害解除を知らせるための信号を送る。コンシューマは、キューからオブジェクトを受け取り、それを処理し、さらにオブジェクトをキューでチェックします。キューが空の場合、コンシューマは手動回復イベントをリセットします。競合状態をスレッド化し、スレッドをスリープ状態にするためにタイマを使用する
私が見つけた問題は、コンシューマがキューをチェックしてmanualreseteventをリセットするまでの間に、プロバイダがキューをロードし、manualreseteventがリセットされる前にセット信号を送信してアプリケーションをハングすることです。
私はキューをチェックするために数秒ごとにスレッドをスリープ状態にするためにタイマを使用することを考えましたが、これはこの問題に対処する健全な方法ですか?
ほとんどの場合、使用しているコードを確認することが非常に重要です。この質問は[mcve]の完璧な候補です。 –
自分自身で同期を処理しないでください。実行しようとしている操作を行うために特別に設計されたツールを使用してください。この場合は 'BlockingCollection'です。 – Servy
ManualResetEventを使用することは本当に推奨されておらず、正しく動作させるのは難しいです。代わりにモニターを使用してください。あなたが望むならば、あなたのための同期を管理するブロッキングキューを既に含むBlockingCollectionを使用することができます。 – Everyone