.NET で別のプロセスのステータスを待つにはどうすればよいですか?
-
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
データベースのルートは次のようになります。 単純, しかし必ずしも最高というわけではありません。