.NET で別のプロセスのステータスを待つにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/166844

  •  03-07-2019
  •  | 
  •  

質問

私は .NET での統合テスト プロジェクトに取り組んでいます。テスト フレームワークの実行可能ファイルはサービスを開始し、サービスが操作を完了するまで待つ必要があります。

exe がサービスのタスクの完了を待機する最善の方法は何ですか (タスクの完了時にサービス自体は終了しません)。

どちらのプロセスも同じデータベースにアクセスできるため、最初に考えたのは、サービスのステータスを記録する単純なテーブルでした。実行が完了したことが通知されると、exe は待機を停止してタスクを完了できます。他のアプローチは?

繰り返しになりますが、サービスはタスクを完了すると実行中/メモリ内状態のままになるため、サービスが終了するのを待っても機能しません。;-)

また、これは純粋に統合テストの目的であり、運用環境には決して導入されないため、「シンプル」という言葉が適切です。

役に立ちましたか?

解決

コマンドラインで(またはハードコーディングのような他のメカニズムを介して)セマフォをサービスに渡し、<< exeで WaitOne()を呼び出して、code> Release()を実行します。

アプリコード:

Semaphore s = new Semaphore(1, 1, "MyNamedSemaphore");
// start service, passing the string "MyNamedSemaphore"
s.WaitOne(); // will wait for Release() in service

サービスコード:

// perform the initial task
// find semaphore name (i.e. from Environment.CommandLine)
Semaphore s = new Semaphore(1, 1, semaphoreName); // will use existing kernel object
s.Release(); // WaitOne in exe will complete

他のヒント

WMI呼び出しは、必要なものを提供します。開始/終了したイベントをキャッチし、そこから必要なことを実行できます。 (これを見せてくれたChris Livelyに感謝します)

http://weblogs.asp.net/whaggard/archive/2006/02/11/438006 .aspx

別の方法として、System.Diagnostics.Processes名前空間を使用して特定のアクティブなプロセスを照会し、プロセスが強制終了されるまでループすることができます。

サービスコードを変更できますか?

その場合は、カーネルイベントオブジェクトを使用します。サービスがオブジェクトを作成し、アプリが通知されるまで待機し、サービスが終了時に通知することができます。クロスプロセスで使用するには、イベントに名前を付ける必要がありますが、それは取得するのと同じくらい簡単です。サービスは、存在するイベントコードで実行を継続することもできます。同じ名前のイベントを作成しようとしない限り、誰も気付かないでしょう。 (または、testappがイベントを作成し、サービスは最初に開始されたイベントに応じてイベントを開くことができます。成功した場合、トリガーを実行できます。それ以外は通常どおり動作します。)

ヒント:状態を「反転」してすべての待機スレッドをトリガーした自動リセットイベントが必要です。

.NETルーチンはわかりませんが、Win32 CreateEvent、SetEvent、およびWaitForSingleObjectが必要です。

IPC チャネルを使用できます。 https://web.archive.org/web/1/http://articles.techrepublic%2ecom%2ecom/5100-10878_11-6143016.html

あるいは、双方向リモートかもしれません: http://www.codeproject.com/KB/IP/TwoWayRemoting.aspx

データベースのルートは次のようになります。 単純, しかし必ずしも最高というわけではありません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top