我正在.NET 中进行集成测试项目。测试框架可执行文件启动服务,然后需要等待服务完成操作。
exe等待服务完成其任务的最佳方法是什么(服务本身不会在任务完成后退出)?
两个进程都可以访问同一个数据库,所以我首先想到的是一个记录服务状态的简单表。一旦收到完成的信号,exe 就可以停止等待并完成其任务。其他方法?
让我重申一下,服务一旦完成其任务,将保持在运行/内存状态,因此等待它退出是行不通的。;-)
此外,这纯粹是出于集成测试的目的,永远不会投入生产,所以“简单”是有效的词。
我正在.NET 中进行集成测试项目。测试框架可执行文件启动服务,然后需要等待服务完成操作。
exe等待服务完成其任务的最佳方法是什么(服务本身不会在任务完成后退出)?
两个进程都可以访问同一个数据库,所以我首先想到的是一个记录服务状态的简单表。一旦收到完成的信号,exe 就可以停止等待并完成其任务。其他方法?
让我重申一下,服务一旦完成其任务,将保持在运行/内存状态,因此等待它退出是行不通的。;-)
此外,这纯粹是出于集成测试的目的,永远不会投入生产,所以“简单”是有效的词。
您可以Semaphore
在命令行上将名称传递给服务(或通过其他机制,如硬编码),然后Release()
通过调用WaitOne()
您的 exe 来等待服务。
应用代码:
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
WMI 调用应该可以满足您的需求。您可以捕捉开始/结束的事件并从那里做您需要做的事情。(感谢 Chris Lively 向我展示了这个)
http://weblogs.asp.net/whaggard/archive/2006/02/11/438006.aspx
或者,您可以使用 System.Diagnostics.Processes 命名空间来查询一个特定的活动进程,并循环直到该进程被杀死。
可以修改服务代码吗?
如果是这样,请使用内核事件对象 - 服务可以创建一个,您的应用程序可以等待它发出信号,并且服务可以在完成时发出信号。您必须为事件命名才能跨进程使用,但这很简单。该服务甚至可以在存在事件代码的情况下继续运行,除非他们尝试创建具有相同名称的事件,否则不会有人注意到。(或者,您的 testapp 可以创建事件,然后服务可以尝试打开它,这取决于哪个先启动。如果成功,它可以执行其触发,否则它照常工作)。
提示:您需要一个自动重置事件,它会立即“翻转”其状态并触发所有等待线程。
我不确定 .NET 例程,但您需要 Win32 CreateEvent、SetEvent 和 WaitForSingleObject。
您可以使用 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
数据库路线很简单,但不一定是最好的。