2009-11-21 100 views
0

前段时间,我用一个定时器写了一个服务,每隔n分钟做一个动作。一切正常。但是现在,我想写一个服务,等待gui应用程序中的信号,消息或其他东西来完成他的工作。唤醒服务,与服务通信

我想我进程睡眠pacefull(不是在一个无限循环嗅东西),直到我的WinForms应用程序告诉他:“嘿,做的事情,给我打电话,当工作完成”

能有人给我凝视点?

谢谢。

回答

3

您可以使用Windows Communication Foundation来允许您的客户端与您的服务进行通信,发送请求并注册以接收来自现有运行作业的进度事件。

0

如果windows服务在同一台机器上,您可以停止并启动服务?或者调用一个web服务来停止/启动另一台机器上的服务?

如果您确实有某项服务需要轮询(或“嗅探”)某项工作,这可能是对数据库的一个非常小且基本的调用,以检查是否会触发实际工作?

+0

如果我停止并启动服务,我的程序如何知道工作何时完成以及是否发生错误? 我想避免民意调查。当然,我可以这样做,然后把结果写在一张桌子上,但我认为这会更好,更优雅地进行某种直接交流。类似于一方提出并被另一方捉住的事件。 – Jonathan 2009-11-21 12:19:11

+0

您可以启动服务的开始。服务可以在完成后自行停止? – 2009-11-21 12:45:23

3

您需要使用进程间通信(IPC)。对于C#而言,这通常意味着.NET更新版本的.NET远程处理(在较早版本的.NET上)或Windows Communication Foundation(WCF)。

本质上,客户端应用程序连接到服务实现的接口,然后可以调用它的方法,就好像它在同一个进程中一样。

如果这太复杂了,可以使用服务等待的命名事件对象以及客户端设置。

1

起点:

自托管WCF服务

1

的IPC机制的任何资格来完成这件事。如果您需要简单的消息传递,请考虑使用命名管道(NamedPipeServerStream)或套接字。如果它们详细说明,请考虑通过IPC通道或WCF远程处理。

就我个人而言,我喜欢这个命名管道。只要确保管道名称的前缀是“Global \”,以便在交互式桌面会话中可见。如果安全是一个问题,请加密消息。在服务中启动后台线程,在管道流上进行阻塞调用以实现消息处理。