9

2 つのクラスを考えてみましょう。ProducerおよびConsumer(それぞれ独自のスレッドを持つ従来のパターンと同じ)。プロデューサーがイベントをトリガーするときに登録できるものProducerを持つことは可能ですか? コンシューマーのイベントハンドラーは独自のスレッドで実行されますか? ここに私の仮定があります:EventConsumer

  • ConsumerProducerのイベントが自分のスレッド内でトリガーされたのか、別のスレッド内でトリガーされたのかはわかりません。

  • の子孫でProducerもなく、メソッドが継承されていません 。ConsumerControlBeginInvoke

PS。私は実装しようとしていませんProducer-Consumerパターン。これらは、プロデューサーをリファクタリングしてスレッドを組み込んでいる 2 つの単純なクラスです。

[アップデート]

問題をさらに拡大するために、可能な限り簡単な方法で作業するハードウェア ドライバーをラップしようとしています。たとえば、ラッパーにはStateChangedメイン アプリケーションが登録されるイベントがあり、ハードウェアが切断されたときに通知されます。実際のドライバーはその存在を確認するためにポーリングする以外に手段がないため、スレッドを開始して定期的に確認する必要があります。使用できなくなったら、追加されたのと同じスレッドで実行する必要があるイベントをトリガーします。これが従来のプロデューサー/コンシューマー パターンであることはわかっていますが、ドライバー ラッパーを使用して単純化しようとしているので、ユーザー コードでコンシューマーを実装したくありません。

[アップデート]

この問題の解決策がないことを示唆するコメントがいくつかあるため、気が変わるかもしれないいくつかの行を追加したいと思います。BeginInvoke私がやりたいことができると考えると、それは不可能ではないはずです(少なくとも理論的には)。独自のものを実装BeginInvokeして 内で呼び出すことは、Producerそれを見る 1 つの方法です。それは私がどのようにそれを行うのか分からないというBeginInvokeことです!

4

5 に答える 5

5

スレッド間通信を行いたい。はい、可能です。System.Windows.Threading.Dispatcher を使用 http://msdn.microsoft.com/en-us/library/system.windows.threading.dispatcher.aspx

Dispatcher は、特定のスレッドの作業項目の優先順位付けされたキューを維持します。Dispatcher がスレッドで作成されると、Dispatcher がシャットダウンされていても、スレッドに関連付けることができる唯一の Dispatcher になります。現在のスレッドの CurrentDispatcher を取得しようとしたときに Dispatcher がスレッドに関連付けられていない場合、Dispatcher が作成されます。DispatcherObject を作成すると、Dispatcher も作成されます。バックグラウンド スレッドで Dispatcher を作成する場合は、スレッドを終了する前に必ず Dispatcher をシャットダウンしてください。

于 2013-08-02T08:34:39.323 に答える