我有一个启动的控制台应用程序,托管一堆服务(长时间运行的启动),然后等待客户端调用它。我有集成测试启动此控制台应用程序并进行“客户端”调用。在进行客户端调用之前,如何等待控制台应用程序完成启动?
我想避免做Thread.Sleep(int)
,因为这取决于启动时间(可能会改变),如果启动更快,我会浪费时间。
Process.WaitForInputIdle
仅适用于具有UI的应用程序(我确认在这种情况下确实会抛出异常)。
我愿意接受尴尬的解决方案,例如,让控制台应用程序在准备就绪时写一个临时文件。
答案 0 :(得分: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();
}
然后客户会做这样的事情
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 ...
}
答案 1 :(得分:4)
如何设置互斥锁,并在启动后将其删除。让客户端应用程序等到它可以在开始执行操作之前获取互斥锁。
答案 2 :(得分:1)
在应用程序的客户端界面中包含一个准备好的检查,或者在准备就绪之前调用它时返回一个未准备好的错误。
答案 3 :(得分:1)
创建可用于查询服务器进程状态的WCF服务。仅在命令行上传递特定命令时才启动此服务。以下特征将确保此服务的快速启动:
测试运行器可以尝试连接到此服务。如果尝试失败,则重试尝试,直到控制台应用程序终止或合理的短暂超时期限到期为止。只要控制台应用程序没有意外终止,您就可以在合理的短时间内开始测试之前依赖此服务提供任何其他信息。
答案 4 :(得分:0)
由于这两个(控制台应用程序,以及进行客户端调用的集成测试应用程序 - 据我所知)是单独的应用程序,因此应该有一个机制 - 一个桥梁 - 将告诉玩作为中介(套接字) ,外部文件,注册表等)。
另一种可能性是你想出了控制台加载服务所花费的平均时间并在测试应用中使用该时间;好吧,只是大声思考!