1

私は常に実行されているWindowsサービスを持っており、15分ごとに何らかのアクションを実行します。また、サービスの実行内容に関する情報を表示するクライアントWinFormsアプリもあります。フォームアプリケーションが最新のステータスで更新されているようにしたいのですが、毎秒ポーリングすることがパフォーマンスの面で良い動きかどうかはわかりません。

  • 起動すると、Windowsサービスは(クライアントフォームから)クエリを受信するためにパイプという名前のWCFを開きます
  • 毎秒、winformのタイマーがパイプにクエリを送信し、結果を表示します。パイプがない場合、フォームにはサービスが実行されていないことが表示されます。

これを行うための最良の方法ですか?サービスの開始時にパイプを開いた場合、パイプは常に開いたままになりますか(閉じるかサービスが停止するまで)?サービスのポーリングに加えて、処理の開始や停止など、特定のイベントを監視アプリケーションに通知する方法があるのではないでしょうか。そうすれば、おそらくすでに大きなイベントについて知っていて、進行状況をポーリングするだけなので、ポーリングを減らすことができます。

私が欠けているものはありますか?

4

1 に答える 1

1

可能であれば、ポーリングを避けます。イベントベースのメカニズムを採用する方がはるかに優れています。これにより、オーバーヘッドが削減され、必要に応じてジャストインタイムのステータス更新が提供されます。

あなたはすでに時代を先取りしています。WCFは間違いなく.NETベースのアプリケーションのためにここに行く方法です。また、フォームとサービスは同じシステム上にあるため、名前付きパイプバインディングも使用できます。これで必要なのは、フォームが開いているときにフォームがリッスンできる、定期的なステータス更新を含むイベントをサービスに公開させることだけです。

これを行うために私が見つけた最も簡単な方法は、JuvalLowyPublish-SubscribeFrameworkを使用することです。このフレームワークの優れた点は、パブリッシャーをサブスクライバーから切り離すことです。パブリッシャーは、サブスクライバーが存在するかどうかを気にせずに、イベントを公開します。サブスクライバーが存在する場合、イベントはその消費のために転送されます。あなたの説明に基づいて、これはあなたにとって非常にうまくいくと思います。

于 2010-06-07T15:59:54.290 に答える