如何等待控制台应用程序空闲?

Ant*_*ean 8 c# timeout console-application

我有一个启动的控制台应用程序,托管一堆服务(长时间运行的启动),然后等待客户端调用它.我有集成测试,启动此控制台应用程序并进行"客户端"调用.在进行客户端调用之前,如何等待控制台应用程序完成其启动?

我想避免这样做,Thread.Sleep(int)因为这取决于启动时间(可能会改变),如果启动速度更快,我会浪费时间.

Process.WaitForInputIdle 仅适用于具有UI的应用程序(我确认它在这种情况下会引发异常).

我对尴尬的解决方案开放态度,让控制台应用程序在准备就绪时写入临时文件.

Chr*_*lor 10

一种选择是创建一个名为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();
}
Run Code Online (Sandbox Code Playgroud)

然后客户会做这样的事情

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 ...
}
Run Code Online (Sandbox Code Playgroud)

  • 我应该真的提到过这一点.Global \或Local \前缀控制事件的范围.Global \使事件在所有会话中"可见",而Local \将使其仅在当前会话中可见.当应用程序在终端服务器会话上运行时,这是一个重要的区别,例如,您可能希望根据您的要求使用Local \. (3认同)
  • 这个名字"做什么"?我使用了名称"MyCompany\HostStarted",控制台应用程序抛出了DirectoryNotFound异常! (2认同)