4

ループ内のキューからデータを受け取るワーカー スレッドを含むクラスがあります。

アプリの別の部分は、このクラスからイベントをシンクします。このクラスは、キュー アイテムごとに発生させます。

これらのイベントは非同期で発生するため、ビジー時には、アプリの他の部分が一度に複数のイベントを処理できます。

これで問題ないはずですが、これが問題を引き起こす可能性があるシナリオを発見しました。

主な問題が解決されるまでの間、迅速な解決策が必要です。フレームワークは、各イベントが処理される間 (順番に処理されるように) ワーカー スレッドを強制的に待機させる簡単な方法を提供しますか? そうでない場合、これを実装する最も簡単な方法は何ですか?

4

6 に答える 6

4

簡単な答えは、イベント ハンドラー内の単一のオブジェクトに対して lock() を実行することです。すべてのスレッドがロックを取得するのを待ちます。

于 2009-02-24T17:26:16.203 に答える
3

私があなたの質問を理解していない限り、ManualResetEvent クラスがここで役立つかもしれません。これを使用して、最後のイベントが完了するまで次のイベントの発生をブロックできます。

于 2009-02-24T17:19:18.480 に答える
1

私の推測では、イベントを発生させてメソッドを直接呼び出すことによってアクションをトリガーすることから単純に離れたいと考えています。

私の知る限り、イベントは非同期になり、それを変更する「簡単な」方法はわかりません。

于 2009-02-24T17:19:16.563 に答える
0

一般的な方法はありません。

最終的に、ハンドラーは追跡のためのメカニズムを提供する必要があります。

イベントを直接発生させるのではなく、BeginInvoke を使用している場合は、ラッパーを使用して、実際のイベント ハンドラーを同期的に呼び出し、ラッパーを非同期的に発生させることができます。ラッパーは、カウンターを維持したり (Interlocked 操作を使用)、必要に応じてイベントを設定したりできます。

何かのようなもの:

TheDelegate realHandler = theEvent;
var outer = this;
ThreadPool.QuereUserWorkItem(x => {
  // Set start of handler
  realHandler(outer, eventArgs);
  // Set handler finished
};
于 2009-02-24T17:18:43.070 に答える
0

キュー読み取りワーカー スレッドによって発生したイベントをシンクするすべてのイベント ハンドラーは、キュー読み取りワーカー スレッドで呼び出されます。イベント ハンドラーが独自のスレッドを生成していない限り、キューを読み取るワーカー スレッドで Thread.Join() を呼び出して、イベント ハンドラーが終了するのを待つことができます。

于 2009-02-24T17:18:54.300 に答える