2009-07-30 9 views
1

複数のサブシステムが異なるスレッドで実行されているアプリケーションがあります(つまり、スレッドはGPSを監視し、スレッドはRFIDリーダーなどを監視します)。スレッドは、winフォーム部分とは別個のサービスレジストリによって開始および監視されます。Winフォームアプリケーションで複数のスレッドを処理する最良の方法

最初のリリースでは、更新タイマーで実行される単一のフォームがあり、各サブシステムの静的変数の値を毎秒確認しています。

私は余分なフォームを追加しているので、これをきれいにしようとしています。現在のアプローチではスレッドの安全性はほとんどありません。それぞれのフォームが気になるイベントだけに登録できるように、基本的な状態が変更されたときに、各サブシステムが新しいイベントをスローするようにして、より反応の良いUIに移行することができます...私は更新タイマーのアプローチが嫌いです。

サブシステムスレッドでイベントがトリガーされるため、ここで問題が発生しています。そのため、イベントと一緒に渡された状態でUIを更新しようとすると、スレッド間呼び出しに関するSystem.InvalidOperationException例外が発生します。

msdnのドキュメントを読んだ後で、私が更新したいフィールドごとにcontrol.invokeを使用しています。フィールドの多い複雑なフォームにはかなり迷惑で、サブシステムを実行するバックグラウンドワーカーを使用しますまたはフォームがまだタイマーで実行され、サブシステム自体を照会することができます。これは避けようとしています。私はフォームを可能な限り基礎となるシステムとは別にしたいと思っています。彼らは気になるイベントだけを知り、関連するフィールドを更新する必要があります。

私の質問は、私はここで何が分からないのですか?サブシステムが独自のスレッドで実行できるようにこのシステムを設計することができますが、まだ結合されていない方法で通知を送信するには、より良い方法がありますか?

任意のヘルプは大

歓声

nimai

答えて

1

のではなく、更新したい各フィールドの間で呼び出すBeginInvokeMethodInvokerデリゲートを使用して、すべてのあなたを行うメソッドを呼び出すには理解されるであろう一度に更新します。たとえば...

BeginInvoke(new MethodInvoker(MyUIUpdaterMethodHere)); 
0

あなたは基本的に疎結合パブ/サブタイプのイベントベースのアーキテクチャを可能にEvent Aggregatorパターンを見てみることができます。 WPFとSilverlightを使用して複合アプリケーションを構築するためのMicrosoft Patterns and PracticesチームのフレームワークであるPrismは、さまざまなUIコンポーネントが設計目標と同じように疎結合した方法で相互に通信できるイベント集約を備えています。あなたはそれを見て、それのイベント集約部分だけを使用しようとすることができます。そうでなければ、ソースコードにアクセスして、要件に合ったものを作ることができます。

0

Windows Forms Synchronization Contextを使用して、SendOrPostCallBackDelegate(またはラムダ)を渡すことができます。これは、複数のコントロールをスレッドセーフな方法で更新できます。

これらのサブシステムがWindowsサービスとして実行されているようです。 winformアプリケーションはどのようにこれらのサブシステムと通信していますか?

関連する問題