从Windows服务控制我的应用程序

时间:2014-08-05 04:07:21

标签: c# windows service windows-services

我有一个C#桌面应用程序,它有一些用户输入字段和2个按钮 - START&停。单击START时,它将连接到服务器/外部设备。连接后,用户可以输入数据并将信息发送到服务器/外部设备。现在我需要创建一个Windows服务来自动启动和停止与服务器的连接。我的意思是建立与服务器连接的服务(如START按钮那样)。

目前我在我的解决方案文件中添加了一个新的Windows服务项目。现在我的解决方案文件有两个.exe文件。第一个用于构建用户应用程序,另一个用于构建Windows服务。

我的实际问题是:我可以在Service1.cs文件的OnStart事件下编写START按钮的点击事件代码(自动启动和停止服务器)吗?

1 个答案:

答案 0 :(得分:1)

您的具体问题的答案是否定的。由于“开始”按钮位于用户应用程序中,因此将在那里触发和处理Clicked事件,而不是在Windows服务中。

为了从用户应用程序控制Windows服务,您必须使用某种进程间通信(IPC)。这才有意义,对吗?正如我已经说过的那样,应用程序中的事件甚至不会被服务看到,因为它们是两个不同的进程。这就是IPC的用武之地。当用户与应用程序交互时,交互被转换为通过IPC机制发送到服务的命令,以便服务可以执行命令所指示的逻辑。同样,服务的结果可以通过IPC机制发送到应用程序以显示给用户。

有各种IPC机制 - 套接字,远程处理,管道,共享内存等。对于基于.NET的软件,推荐的方法是Windows Communication Foundation (WCF)。简而言之,WCF允许您定义特定于您的使用的编程API ,以便在多个应用程序域之间交换信息。实质上,您只需调用方法即可交换数据。从开发人员的角度来看,它只是一个函数调用。如何打包信息并将其发送到其他应用程序域取决于WCF管道的配置方式。想用套接字?想用管道吗?想使用HTTP吗?只需更改WCF配置即可使用所有这些选项(以及更多选项)。

我已经成功使用了WCF,但学习曲线确实很陡峭。事实上,出于性能原因,我已经退回到使用套接字作为我的IPC机制。不过,WCF值得一看,因为您不必担心所选IPC机制的复杂性。我已经回答了另一个问题here。它应该让你开始。

HTH