我正在开发.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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top