2008-10-03 57 views
3

我正在使用.NET進行集成測試項目。測試框架可執行文件啓動服務,然後需要等待服務完成操作。如何在.NET中等待另一個進程的狀態?

exe等待服務完成其任務(服務本身不會在任務完成時退出)的最佳方法是什麼?

這兩個進程都可以訪問同一個數據庫,所以我的第一個想法是一個簡單的表格,它記錄了服務的狀態。一旦它發出信號,exe就可以停止等待並完成任務。其他方法?

讓我重申一旦服務完成其任務,服務將保持運行/內存狀態,因此等待它退出將無法工作。 ;-)

此外,這純粹是爲了集成測試的目的,並且永遠不會投入生產,所以「簡單」是可操作的詞。

回答

5

您可以通過一個Semaphore名稱到服務在命令行上(或者通過一些其他的機制,如硬編碼),然後在服務等待Release()它,在你的EXE調用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 
+0

真棒。我認爲這會很好地工作。謝謝! – 2008-10-03 14:41:11

1

WMI調用應該給你你需要的東西。你可以捕捉開始/完成的事件,並從那裏做你需要的。 (感謝Chris活潑用於顯示本我)

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

或者您可以使用System.Diagnostics.Processes命名空間,直到進程被殺死來查詢一個特定的活動進程,並循環。

+0

WMI ...有趣。什麼會觸發「流程修改」事件? – 2008-10-03 13:40:39

+0

我真的不太確定,幾天前我只是關注這件事。我想這將是沿着它的屬性改變的一些東西。 – 2008-10-03 14:10:04

1

可以修改服務代碼?

如果是這樣,請使用內核Event對象 - 服務可以創建一個,您的應用可以等待它發送信號,服務可以在完成時發出信號。您必須爲該活動提供一個名稱,以便將其用於跨進程,但這只是簡單而已。該服務甚至可以繼續在事件代碼存在的情況下運行,除非他們嘗試創建具有相同名稱的事件,否則沒有人會注意到。 (或者,你的testapp可以創建事件,然後服務可以嘗試打開它,具體取決於哪一個是首先啓動的,如果成功,它可以執行它的觸發,否則它會像往常一樣工作)。

提示:您想要一個自動重置事件,它立即將其狀態翻轉回來,並觸發所有等待的線程。

我不確定.NET例程,但您需要Win32的CreateEvent,SetEvent和WaitForSingleObject。

相關問題