2008-10-03 55 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。

相关问题