C#学习教程:创建用于监视正在运行的Windows服务并与其交互的用户界面并希望创建一个UI,使我能够与该服务使用的每个插件进行交互。在UI和长期运行的Windows服务之间进行通信的最常见方式是什么?我正在考虑提供一个中间位置,如数据库,并使用某种消息队列向服务发出命令。有没有人实施过这样的方法,或者其他一些优秀的方法?一路上遇到了哪些问题?不要使用远程处理!虽然它肯定会起作用,但微软表示远程处理是一项遗留技术,所有新的分布式应用程序都应该使用WCF进行开发。有关详细信息,请参阅此处WindowsCommunicationFoundation(WCF)是两个.NET进程相互通信的推荐方式。WCF提供了一个统一的编程模型,通过抽象出与特定通信机制(如套接字、管道等)相关的许多复杂性,极大地简化了分布式开发。鉴于您的具体情况,我建议将每个Windows服务作为WCF插入服务。对于每个WCF服务(即插件),定义它需要向UI公开的接口。该接口只是一个加载了ServiceContract属性的C#接口。此接口包含方法,每个方法都装饰有OperationContract属性,您的UI将使用这些方法与WCF服务(插件)进行通信。这些方法可以接受并返回任何可序列化的.NET类型,或者通常是您自己的自定义类型。要在WCF中使用自定义类型,只需使用DataContract属性修饰它们,并使用DataMember属性标记要通过WCF交换的成员。一旦定义了ServiceContract接口,定义一个实现该接口的类。每个OperationContract方法做任何它需要做的事情,例如,与数据库交互,计算一些值等。完成这些后,您就有效地定义了WCF服务。这是一个简短但有效的示例:usingSystem.ServiceModel;namespaceAdditionServiceNamespace{[DataContract]publicclassComplex{[DataMember]publicintreal;[数据成员]publicintimag;}[ServiceContract]publicinterfaceIAdditionService{[OperationContract]ComplexAdd(Complexc1,Complexc2);}publicclassAdditionService:IAdditionService{publicComplexAdd(Complexc1,Complexc2){Complexresult=newComplex();结果.real=c1.real+c2.real;结果.imag=c1.imag+c2.imag;返回结果;}}}下一步是托管此WCF服务,以便UI可以使用它。由于您将使用Windows服务,因此您可以像这样在Windows服务的OnStart()回调中轻松托管WCF服务:使用System.ServiceProcess;使用AdditionServiceNamespace;namespaceWindowsServiceNamespace{publicclassWindowsService:ServiceBase{staticvoidMain(){ServiceBase[]ServicesToRun=newServiceBase[]{newWindowsService()};ServiceBase.Run(ServicesToRun);私人服务主机_主机;公共WindowsService(){InitializeComponent();}protectedoverridevoidOnStart(string[]args){_host=newServiceHost(typeof(AdditionService));_host.Open();}protectedoverridevoidOnStop(){try{if(_host.State!=CommunicationState.Closed){_host.Close();}}catch{//以某种方式处理异常...记录到事件查看器,例如}}}}唯一要做的就是为Windows服务定义一个app.config文件,它将配置WCF服务的某些必需方面。这似乎有点矫枉过正,但请记住两点。首先,当您将WCF服务类添加到您的项目时,VisualStudio会自动为您提供一个基本的app.config文件。其次,app.config文件使您无需更改代码即可极大地控制WCF服务。下面是上面示例的配套app.config文件:请注意,AdditionServiceWCF服务有两个端点。元数据交换端点用于客户端生成的代码,因此暂时忽略它。第一个终结点配置为使用NetNamedPipeBinding。如果您的UI和Windows服务将在同一台机器上运行,则使用此绑定(有关选择要使用的适当绑定的流程图,请参见此处)。但是,如果您的UI和Windows服务将在不同的计算机上运行,??则不能使用此绑定。在这种情况下,您可以使用NetTcpBinding作为替代方法。要用NetNamedPipeBinding替换NetTcpBinding,您只需像这样更改端点的地址和绑定:/AdditionService"binding="netTcpBinding"contract="AdditionServiceNamespace.IAdditionService"/>无需更改代码!进行更改,重新启动服务,WCF服务现在可用于远程计算机。如果需要,您甚至可以为同一个WCF服务允许多个端点。重点是,app.config文件提供了很大的灵活性,而无需更改您的代码。就是这样!你是现在可以在Windows服务中托管WCF服务以供UI使用。那么UI方面(即客户端)是如何工作的呢?这就是WCF真正发挥作用的地方。最简单的入门方法WCF是利用VisualStudio的AdditionService的代码生成功能。确保你的Windows服务(托管AdditionService的服务)正在运行。在UI项目中,在解决方案资源管理器中右键单击该项目并选择“添加服务”参考...”菜单选项。在“Address”框中,键入net.pipe://localhost/AdditionService,然后单击“Go”按钮。您应该会看到“AdditionService”出现在“Services”列表中。在“Namespace”框中,键入AdditionService,然后单击“OK”按钮。以下这些步骤将生成一个客户端代理和一个正确定义的app.config文件,这些文件将被添加到您的UI项目中。这个客户端代理成为你的客户端AdditionServiceAPI,你可以像这样使用它:usingTestConsoleApp.AdditionService;命名空间TestConsoleApp类程序{staticvoidMain(string[]args){AdditionServiceClientclient=newAdditionServiceClient();复合体c1=newComplex(),c2=newComplex();c1.real=3;c1.imag=5;c2.real=1;c2.imag=7;复杂结果=client.Add(c1,c2);注意这是多么简单。基本上,实例化客户端代理AdditionServiceClient。然后创建两个Complex对象。最后,调用客户端代理上的Add()方法并返回Complex结果。幕后发生的事情是客户端代理的Add()方法实际上将两个Complex对象传递给Windows服务中托管的AdditionServiceWCF服务。AdditionService执行加法,并返回结果。所有这些都发生在命名管道上,但请注意,这里根本没有命名管道特定的代码!WCF已经抽象掉了IAdditionService接口定义的编程模型背后的所有复杂性。我知道有很多信息需要消化,但我希望WCF的强大功能和易用性显而易见。当然,此示例仅涉及WCF中所有可用内容的一小部分。但最终,WCF应该是用于在UI和Windows服务之间进行通信的机制。有关详细信息,我强烈推荐JuvalLowy的书WritingWCFServicesforAllThingsWCF。您还可以访问他的网站IDesign.net,获取免费的WCF代码示例。有关WCF的更多介绍,请在dnrTV观看此免费视频。它涵盖了WCF的用途,并通过一些易于理解的示例演示了WCF编程。最好的选择是通过IPC通道使用.NET远程处理。虽然设置起来可能看起来很复杂,但第二次就很容易了。我建议您首先将一些示例从一个应用程序公开到另一个应用程序。我以前没有使用过消息队列,所以我不能对此发表评论。以上就是C#学习教程的全部内容:创建用于监控运行的Windows服务并与之交互的用户界面。网络收藏不代表立场,如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
