如何等待.NET中另一个进程的状态?

时间:2020-03-06 15:04:29  来源:igfitidea点击:

我正在从事.NET中的集成测试项目。测试框架可执行文件启动服务,然后需要等待服务完成操作。

exe等待服务完成其任务(服务本身不会在任务完成时退出)的最佳方法是什么?

这两个进程都可以访问同一个数据库,因此我首先想到的是一个简单的表,用于记录服务的状态。一旦发出信号,它便可以停止等待并完成其任务。其他方法?

让我重申一下,该服务一旦完成其任务,将保持在运行中/内存中状态,因此等待其退出将不起作用。 ;-)

而且,这纯粹是出于集成测试的目的,并且永远不会投入生产,因此"简单"是有效的词。

解决方案

我们可以使用IPC频道:https://web.archive.org/web/1/http://articles.techrepublic%2ecom%2ecom/5100-10878_11-6143016.html

或者两种方式进行远程处理:http://www.codeproject.com/KB/IP/TwoWayRemoting.aspx

数据库路由将很简单,但不一定是最好的。

WMI呼叫应该给我们我们所需要的。我们可以捕获已开始/已完成的事件,然后从那里开始做我们需要做的事情。 (感谢克里斯·利弗利(Chris Lively)向我展示了这一点)

http://weblogs.asp.net/whaggard/archive/2006/02/11/438006.aspx

或者,我们可以使用System.Diagnostics.Processes命名空间来查询一个特定的活动进程,并循环直到该进程被杀死为止。

我们可以在命令行上(或者通过某种其他机制,如硬编码)将"信号量"名称传递给服务,然后通过在电话中调用" WaitOne()"来等待服务将其释放(" Release()")可执行程序。

应用程式码:

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

我们可以修改服务代码吗?

如果是这样,请使用内核Event对象,服务可以创建一个Event对象,应用可以等待其发出信号,并且服务可以在完成时发出信号。我们必须为事件指定一个名称,以供跨进程使用,但这要尽可能简单。该服务甚至可以在存在事件代码的情况下继续运行,除非他们尝试创建具有相同名称的事件,否则没人会注意到。 (或者,testapp可以创建事件,然后该服务可以尝试打开该事件,具体取决于首先启动的事件。如果成功,则可以执行其触发操作,否则照常运行)。

提示:我们需要一个自动重置事件,该事件会在触发所有等待线程后立即将其状态"翻转"。

我不确定.NET例程,但我们需要Win32 CreateEvent,SetEvent和WaitForSingleObject。