簡體   English   中英

如何等待控制台應用程序空閑?

[英]How do I wait until a console application is idle?

我有一個啟動的控制台應用程序,托管一堆服務(長時間運行的啟動),然后等待客戶端調用它。 我有集成測試啟動此控制台應用程序並進行“客戶端”調用。 在進行客戶端調用之前,如何等待控制台應用程序完成其啟動?

我想避免做Thread.Sleep(int)因為這取決於啟動時間(可能會改變),如果啟動速度更快 ,我會浪費時間。

Process.WaitForInputIdle僅適用於具有UI的應用程序(我確認在這種情況下它確實會引發異常)。

我對這些尷尬的解決方案開放態度, 讓控制台應用程序在准備就緒時寫一個臨時文件。

一種選擇是創建一個名為EventWaitHandle。 這將創建一個可以跨進程使用的同步對象。 然后,您的“客戶端”應用程序會等到事件發出信號后再繼續。 一旦主控制台應用程序完成啟動,它就可以發出事件信號。

http://msdn.microsoft.com/en-us/library/41acw8ct(VS.80).aspx

例如,您的“服務器”控制台應用程序可能具有以下內容。 這不是編譯所以它只是一個起點:)

using System.Threading;
static EventWaitHandle _startedEvent;
static void main()
{  
  _startedEvent = new EventWaitHandle(false, EventResetMode.ManualReset, @"Global\ConServerStarted");

  DoLongRunnningInitialization();

  // Signal the event so that all the waiting clients can proceed
  _startedEvent.Set();
}

然后客戶會做這樣的事情

using System.Threading;
static void main()
{  
  EventWaitHandle startedEvent = new EventWaitHandle(false, EventResetMode.ManualReset, @"Global\ConServerStarted");

  // Wait for the event to be signaled, if it is already signalled then this will fall throught immediately.
  startedEvent.WaitOne();    

//  ... continue communicating with the server console app now ...
}

如何設置互斥鎖,並在啟動后將其刪除。 讓客戶端應用程序等到它可以在開始執行操作之前獲取互斥鎖。

在應用程序的客戶端界面中包含一個准備好的檢查,或者如果在它准備好之前調用它,則返回一個未准備好的錯誤。

創建可用於查詢服務器進程狀態的WCF服務。 僅在命令行上傳遞特定命令時才啟動此服務。 以下特征將確保此服務的快速啟動:

  • 將此服務作為客戶端應用程序的第一個操作托管
  • 使用net.tcp或net.pipe綁定,因為它們啟動非常
  • 保持此服務盡可能簡單,以確保只要控制台應用程序不終止,它將保持可用

測試運行器可以嘗試連接到此服務。 如果嘗試失敗,則重試嘗試,直到控制台應用程序終止或合理的短暫超時期限到期為止。 只要控制台應用程序未意外終止,您就可以在合理的短時間內開始測試之前依賴此服務提供任何其他信息。

  • 由於這兩個(控制台應用程序和集成測試應用程序,使客戶端調用 - 據我所知)是單獨的應用程序,所以應該有一個機制 - 一個橋梁 - 將告訴播放作為中介(套接字,外部文件,注冊表,等等)。

  • 另一種可能性是你想出了控制台加載服務所花費的平均時間並在測試應用中使用這段時間; 好吧,只是大聲思考!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM