3

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

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

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

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

また、これは純粋に統合テストを目的としたものであり、本番環境には決して入らないため、「シンプル」という言葉が有効です。

4

4 に答える 4

5

コマンドラインで(またはハードコーディングSemaphoreなどの他のメカニズムを介して)サービスに名前を渡し、exeを呼び出してサービスを待つことができます。Release()WaitOne()

アプリコード:

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
于 2008-10-03T13:45:55.680 に答える
1

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

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

ヒント:トリガーされたすべての待機中のスレッドをすぐに状態に戻す自動リセットイベントが必要です。

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

于 2008-10-03T13:50:47.997 に答える
1

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

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

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

于 2008-10-03T13:37:21.080 に答える
0

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

データベース ルートは単純ですが、必ずしも最適とは限りません。

于 2008-10-03T13:36:45.433 に答える