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

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

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

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

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

一种选择是创建一个名为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绑定,因为它们启动非常
  • 保持此服务尽可能简单,以确保只要控制台应用程序不终止,它将保持可用

测试运行器可以尝试连接到此服务。 如果尝试失败,则重试尝试,直到控制台应用程序终止或合理的超时期限到期为止。 只要控制台应用程序未意外终止,您就可以在合理的短时间内开始测试之前依赖此服务提供任何其他信息。

  • 由于这两个(控制台应用程序和集成测试应用程序,使客户端调用 – 据我所知)是单独的应用程序,所以应该有一个机制 – 一个桥梁 – 将告诉播放作为中介(套接字,外部文件,注册表,等等)。

  • 另一种可能性是你想出了控制台加载服务所花费的平均时间并在测试应用中使用这段时间; 好吧,只是大声思考!