C# WCF服务和独立线程之间通信的最佳方式是什么?

C# WCF服务和独立线程之间通信的最佳方式是什么?,c#,multithreading,wcf,design-patterns,C#,Multithreading,Wcf,Design Patterns,这个问题的措辞不一定能公正地处理这个问题 我有一个客户端UI,它位于一个本地框上,有一个后台windows服务来支持它,同时它执行后台功能 客户端UI只是表示层,windows服务执行所有的重击操作。。。所以他们两人之间需要沟通。在google上花了一段时间并阅读了最佳实践之后,我决定使用WCF和命名管道创建服务层 客户端UI是WCF客户端,windows服务充当WCF主机(仅在本地托管)以支持客户端 所以这很好,应该是这样的。客户端UI可以将数据传递给WCF主机。但我的问题是,我如何使这些

这个问题的措辞不一定能公正地处理这个问题

  • 我有一个客户端UI,它位于一个本地框上,有一个后台windows服务来支持它,同时它执行后台功能
  • 客户端UI只是表示层,windows服务执行所有的重击操作。。。所以他们两人之间需要沟通。在google上花了一段时间并阅读了最佳实践之后,我决定使用WCF和命名管道创建服务层
  • 客户端UI是WCF客户端,windows服务充当WCF主机(仅在本地托管)以支持客户端
所以这很好,应该是这样的。客户端UI可以将数据传递给WCF主机。但我的问题是,我如何使这些数据有用我在windows服务/WCF主机上运行了几个引擎,但WCF主机完全不知道是否存在任何后台引擎。我需要客户端的通信请求才能与这些引擎交互


关于如何促进WCF主机和正在运行的线程之间的通信,有人知道一个好的设计模式或方法吗?

我认为最好的办法是拥有一些静态属性或方法,可以用来在服务线程/进程和WCF服务之间交换数据

或者,我们实现这一点的方法是使用数据库,其中客户端或wcf服务将服务响应的请求排队,并且当服务可用时,使用对这些请求的响应更新数据库。然后,客户端定期轮询数据库(通过WCF),以检索任何未完成请求的结果

例如,如果客户机需要生成报告,我们通过WCF发出请求,WCF在数据库中创建报告生成请求

负责生成报告的服务定期轮询此表,当它找到一个新条目时,它会派生一个生成报告的新线程/进程

报告完成后(成功或失败),服务将使用结果更新数据库表

同时,客户会定期询问WCF服务是否有任何提交的报告已经完成。WCF服务反过来轮询表中已完成但尚未传递给客户端的任何请求,从中收集信息,并将其返回给客户端

这种机制允许我们做几件事:

1) 随着工作负载的增加,我们可以跨多个物理/虚拟机扩展处理这些请求的服务数量

2) 给定的服务可以支持许多客户机

3) 通过WCF接口,我们可以将这种支持扩展到我们选择支持的任何客户端平台(web、win、平板电脑、手机等)

忘了提一下:

仅仅因为我们选择使用数据库并不意味着您必须使用它来实现这个模式。通过创建一个静态请求集合,WCF服务和worker服务可以以与我们使用数据库大致相同的方式访问该集合,您可以轻松地实现相同的功能


您只需要非常小心地获取和释放静态属性上的锁,以避免跨线程冲突或死锁。

您是在谈论消息队列类型模式吗?您需要异步地将任务排队,然后在完成后向客户机报告?我认为您已经完全明白了这一点。我曾考虑使用数据库表作为消息队列流,但我有点担心开销,因为它与数据库记录有关(查看如何有N个客户机与其服务器通信)。我认为,您的“忘记提及”是最好的计划,因为我可以使用静态队列结构将消息排队,而不是在消息完成后没有任何价值的地方将它们持久化。这样,如果我使用正确的线程锁定过程,我就可以访问静态消息,并根据需要将它们出列。非常感谢你。