2011-09-17 20 views
0

私はマルチスレッドとC#の新機能です。この問題を解決する必要があります: イベントハンドラはかなり頻繁に呼び出されます。 DLLから呼び出されます) ハンドラメソッドが呼び出されると、何らかの処理を行う1つのスレッドを作成して実行する必要があり、その処理は数ミリ秒から数秒に変わります。処理が終了すると、他のスレッドも作成できます。一方、作成されたスレッドは実行中で、他のスレッドを作成してeventhandlerから実行することはできません。イベントハンドラから自殺スレッドを実行しています

多くのおかげで助けてください。

+0

以前に作成されたワーカースレッドがまだ実行されているときにイベントが発生したときに、何をしたいですか?ワーカースレッドが完了するまで、イベントを発生させるスレッドをブロックしますか?新しいスレッドの生成をキューに入れて戻りますか?新しいスレッドを生成して返さないことを決定しますか? – Ani

+0

スレッドがすでに実行されているかどうかをイベントハンドラでチェックインしてスレッドセーフにする方法を教えてください。それはかなり簡単に、ちょうど新しいスレッドを作成することをスキップするようです。 – BreteP

答えて

4

これはすべてかなり複雑に聞こえますが、実際に何をしようとしているのかは分かりませんが、単一の余分なスレッドと共有キュー作業項目。イベントハンドラはキューに別の作業項目を追加するだけで、スレッドはアイテムをキューから取り出し、一度に1つずつ処理します。

.NET 4はBlockingCollection<T>タイプでこれを簡単にします。 .NET 4より前の段階では、もちろん実行可能ですが、サードパーティのスレッドセーフなプロデューサ/コンシューマキューを見つけたり、自分で書き込んだりする必要があります。

+0

私はhttpストリームを読んでいるdllをクローズしており、時にはそれがイベントハンドラを起動するデータを見つけました。スレッドを作成し、そのデータをスレッドに渡して処理させる必要があります。その間、dllスレッドはまだ実行されており、httpとfireイベントハンドラからデータを読み込みますが、最初のスレッドが完了するまでデータ処理用の新しいスレッドを作成したくありません。 – BreteP

0

自分自身を殺すスレッドに問題があります。スレッドが自分自身を殺すときは、メインスレッドと同期する必要があります。

私は、仕事をした専用のスレッドを使う方が良いと思います。ブロッキングキューを使用し、プロデューサ/コンシューマパターンを実装します。何もしなければスレッドを殺すのではなく、より多くの作業が到着するまでアイドル状態にしておきます。

+0

hmでもうまくいくはずですが、私が書いたように、私はスレッド化するのがとても新しいです。いくつかの短い例、特にスレッドが処理中であるかどうかを検出する方法(イベントハンドラ内のスレッドにデータを送信することをスキップする方法)があります。 – BreteP