2009-08-21 56 views
0

我创建了一个C#windows服务(Serv.exe),它负责在正在运行的应用程序(A.exe)的请求下执行各种任务,其中一些可能需要很长时间并且我需要一种方法来从调用应用程序(A.exe)中了解我所请求的操作(在服务上运行)的状态。如何获取Windows服务自定义状态? [C++/C#]

目前我已经开始实现这个的方法是通过使用ControlService(句柄,命令,状态)向服务发送自定义命令来执行被请求的任务,我也使用QueryServiceStatus(句柄,状态)从SCM获得服务的状态 - 所以基本的管道工作就在那里并且正在工作。

现在我遇到的问题是,在发送我的ControlService命令(工作正常)后,调用应用程序(A.exe)继续运行,并且在某个点上,它需要知道它请求的服务任务是否完成 - 因此我正在寻找一种方法来查询服务来报告自定义状态,而不是实际服务的标准运行,停止,挂起,暂停状态,但是我使用ControlService()所做的请求的状态请求。

这是可能的吗? 任何帮助或暗示都会受到人们的赞赏。

感谢,

回答

1

在过去,当我不得不处理更复杂的通信,我通常从QueryServiceStatus切换到具有服务实际上通过IPC提供的通信手段。

SocketsPipes这两个工作都很好。客户和服务在这种沟通方式上可以拥有无​​限的自由。

+0

看看使用套接字,管道或RPC(或者像注册表这样的诡计)而不是使用Windows消息传递的原因,它将无法在Vista中运行,因为微软已经在使用会话的服务和应用程序之间实现了隔离。 – 2009-08-21 16:49:08

+0

这将是更喜欢的方法?问题是我每隔23分钟只发送一次命令到服务器,所以打开端口和通道/管道似乎是过度杀伤性的 - 我认为Command很好,因为它非常简单,并确保交付,而不用担心安全,权限等等。 那么有没有办法让自定义状态回来? – Shaitan00 2009-08-21 16:50:30

+0

我其实很喜欢Pipes(我喜欢的方法),特别是如果你使用C#。命名管道和匿名管道工作得非常好,开销相当低。如果您的客户端应用程序与服务在同一台计算机上运行,​​则它们特别容易。这种方法的另一个优点也是易于扩展。随着时间的推移,你总是可以添加更多的消息。管道可以是双向的,所以服务器可以直接通知客户端(不需要查询)等。 – 2009-08-21 16:57:38

0

对我来说,很好的建立一个外部队列,如MSMQ或数据库表。这些代码很容易编写,支持应用程序和服务之间的双向通信,允许多个应用程序甚至可以通过网络与一项服务交谈,并允许您关闭应用程序并稍后启动并保持消息不变。此外,调试更容易,因为您可以检查流量,特别是在使用数据库并将消息标记为已读而不是将其删除时。当您不想使用重量级数据库或不想担心MSMQ是否已安装或正在运行时,通过System.Data.Sqlite包装器处理SQLite是完美的。

另一种选择是将您的逻辑放入WCF服务中,并通过HTTP或TCP与其通信。

+0

我认为MSMQ要求我安装一些东西(MSMQ),不允许有更多的第三方工具。但是我们已经安装了SQL 2005 - 这是我没有考虑过的用于这种小型通信的想法。 WCF支持.Net 2.0? 你的意思是使用TCP(套接字)调用应用程序(C++ 6)通信到服务(WCF)?对于来自调用应用程序的一次(23分钟)请求而言,这不是过度杀伤力吗?并不需要打开端口等...?我需要减少影响,并且不能让IT参与其中。 – Shaitan00 2009-08-21 17:15:50

+0

一些评论 - 从VC++ 6使用MSMQ并不是微不足道的。 WCF是.NET 3.0+。 – 2009-08-21 17:34:11

+0

那么,如果你不能安装任何东西,并且仅限于VC++ 6和.Net 2.0,那么一个小型的SQL Server 2005表就可以容易地获得服务中的消息。这也是从服务中捕获状态消息和错误的好方法。 – 2009-08-21 18:35:45