2016-12-21 19 views
0

私は消費者とプロバイダスレッドとキューを持つC#コンソールアプリケーションを持っています。消費者は永続的なループに陥っており、それは手作業によって回避されます。プロバイダスレッドは、オブジェクトを待ち行列に入れ、手動で障害解除を知らせるための信号を送る。コンシューマは、キューからオブジェクトを受け取り、それを処理し、さらにオブジェクトをキューでチェックします。キューが空の場合、コンシューマは手動回復イベントをリセットします。競合状態をスレッド化し、スレッドをスリープ状態にするためにタイマを使用する

私が見つけた問題は、コンシューマがキューをチェックしてmanualreseteventをリセットするまでの間に、プロバイダがキューをロードし、manualreseteventがリセットされる前にセット信号を送信してアプリケーションをハングすることです。

私はキューをチェックするために数秒ごとにスレッドをスリープ状態にするためにタイマを使用することを考えましたが、これはこの問題に対処する健全な方法ですか?

+3

ほとんどの場合、使用しているコードを確認することが非常に重要です。この質問は[mcve]の完璧な候補です。 –

+0

自分自身で同期を処理しないでください。実行しようとしている操作を行うために特別に設計されたツールを使用してください。この場合は 'BlockingCollection'です。 – Servy

+0

ManualResetEventを使用することは本当に推奨されておらず、正しく動作させるのは難しいです。代わりにモニターを使用してください。あなたが望むならば、あなたのための同期を管理するブロッキングキューを既に含むBlockingCollectionを使用することができます。 – Everyone

答えて

0

ManualResetEventをリセットしてからキューを調べる前に、キューが排水されるまでイベントを待つところまで戻りません。そうすれば、レースが行うことができない悪いことは、空のキューで1回の偽のチェックが行われることです。

今すぐリセットする予定ですので、代わりにAutoResetEventを使用してください。

可能であれば、BlockingCollectionを使用して同期を処理させてください。

関連する問題