如何在.NET中等待另一个进程的状态?
-
03-07-2019 - |
题
我正在开发.NET中的集成测试项目。测试框架可执行文件启动服务,然后需要等待服务完成操作。
exe等待服务完成任务的最佳方法是什么(服务本身不会在任务完成时退出)?
两个进程都可以访问同一个数据库,所以我首先想到的是一个记录服务状态的简单表。一旦它发出信号表明它已经完成,exe就可以停止等待并完成其任务。其他方法?
让我重申,一旦服务完成任务,该服务将保持运行/内存状态,因此等待它退出将无效。 ; - )
此外,这纯粹是为了集成测试目的,并且永远不会投入生产,因此“简单”。是一个有效的词。
解决方案
您可以在命令行上(或通过其他一些机制,如硬编码)将 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
其他提示
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
数据库路由简单,但不一定是最好的。