2017-01-06 14 views
2

現在、いくつかのサブプロセス(System.Diagnostics.Process)を実行しているサービスがあります。各サブプロセスは何時間も実行することができ、特定の事前定義された状態(「開始」、「作業中」、「クリーンアップ」など - 完全に事前定義され、各状態に添付されたカスタムデータは報告されません)各プロセスは個別のWindowsサービスにすることはできません(Windowsサービス状態よりも多くの状態が存在する可能性があります)。私は何とかこの状態を親サービスに報告する必要があります。すべてのプロセスが同じWindowsマシン上で実行されています。親サービスへのサブプロセス状態の報告

私は、サービスによって開始されたプロセス以外のプロセスからサブプロセス状態を問い合わせることができ、それらのサブプロセスから各サブプロセス状態について親サービスを更新できる必要があります。各プロセスは固有のIDを取得するため、プロセス自体を管理することなく、他のプロセスが状態を簡単に読み取ることができます。すべてのプロセスは、各サブプロセスに固有のIDが割り当てられた構成ファイルを共有します。私はそうのようにそれをすることについて考えた:

  • は、すべてのサブプロセスを書く
  • 出力で各行を読んで、サービス(RedirectStandardOutput = true)にサブプロセスの標準出力をリダイレクトし、 『特別な』行(STATECHANGE:state)をキャッチその状態が変わるたびに、定義済みの場所にあるファイルに状態を通知し、サービス終了時にそのファイルを削除します。

私は何年も前に解決された問題の解決策を見つけようとしているようで、私はその解決策を見つけられませんでした。そのような州の報告を行うための「良い」方法はありますか?

答えて

2

一般に、プロセス間通信(IPC)の分野を掘り下げて検討しています。

この質問には、Microsoft Windows固有のタグが付けられていませんが、C#および.NETとしてタグ付けされているため、Windows環境で実行している可能性があります。私の答えはあなたがMS Windowsでこのシステムを実行していることを前提としています。

このような問題に対する一般的な解決策は、データベース内のストア状態です。各サービス/プロセスは、データベースに独立して書き込むことができ、その情報に関心のあるプロセスがクエリを実行できます。しかし、これは実際の双方向コミュニケーションではありません。

親プロセスが子プロセスと通信する方法はさまざまですが、子プロセスがある種のメッセージポンプをスレッド上で実行し、別のスレッドでデータ処理を実行すると最も簡単でしょう。メッセージポンプはメッセージを受信して​​応答し、データ処理スレッドはその処理を行います。

  • のWindows通信フレームワーク(WCF)
  • 名前付きパイプ
  • を:この方式を使用

    、メッセージを含む、いくつかの異なる方法で交換することができます。NET Remotingの

  • MSメッセージキュー(MSMQ)
  • Windowsのクリップボード
  • ダイナミックデータエクスチェンジ(DDE)
  • コンポーネントオブジェクトモデル(COM)
  • メモリマップファイル
  • リモートプロシージャコール(RPC)
  • ソケット

これらのプロセスの全てが同じマシン上で実行されているので、パイプAシンプルな選択肢。 System.IO.Pipes名前空間の確認

WCFを使用すると、パイプの上だけでなく他のIPCメカニズムの上でも実装できるリッチなメッセージングインターフェイスを構築できます。

.NET上でのプロセス間通信について説明しているI'netには多くの優れたリソースがあります。ここではそれらを再ハッシュするのではなく、「.NET」、「プロセス間通信」、 IPC "と"ローカルマシン "(ローカルマシン上のプロセス間でIPCが必要なため)。

+0

はい、これはすべてWindowsで実行されていますが、私はこれを明確にするために私の質問を編集しました。これはちょうど私が必要なもののように見える、ありがとう! –

関連する問題