2011-12-16 35 views
5

问题不一定做的问题正义的措辞......什么是WCF服务和独立线程之间进行通信的最佳方式?

  • 我有一个客户端UI坐在沙发上与本地框和一个后台窗口服务,以支持它,而它执行后台功能。
  • 客户端用户界面只是表示层,而Windows服务执行所有的硬性操作...所以需要在他们两个之间进行通信。在谷歌上花了一段时间并阅读最佳实践后,我决定使用WCF和命名管道来制作服务层。
  • 客户端UI是WCF客户端,而Windows服务充当WCF主机(仅在本地托管)来支持客户端。

所以这工作正常,因为它应该。客户端UI可以将数据传递给WCF主机。但我的问题是,我如何使这些数据有用? 我有几个引擎运行在Windows服务/ WCF主机上,但WCF主机完全不知道任何后台引擎的存在。我需要客户端的通信请求才能够与这些引擎进行交互。

有没有人有任何关于如何处理WCF主机和正在运行的线程之间进行通信的良好设计模式或方法的想法?

+0

你在谈论消息队列类型模式吗?你需要异步排队,然后在完成后向客户报告? – slugster 2011-12-16 01:43:22

回答

3

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

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

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

负责生成报告的服务定期轮询此表,并且当它找到新条目时,它将关闭生成报告的新线程/进程。

当报告已完成(成功或失败)时,服务会使用结果更新数据库表。

同时,如果任何提交的报告已完成,客户会定期询问WCF服务。 WCF服务反过来查询已完成但尚未交付给客户端的请求,从中收集信息并将其返回给客户端。

这种机制允许我们做了两件事情:

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

2)给定的服务可以支持众多的客户。 3)通过WCF界面,我们可以将此支持扩展到我们选择支持的任何客户端平台(web,win,tablet,phone等)。

忘了提:

只是因为我们选择使用一个数据库并不意味着你为了实现这种模式必须。您可以通过创建静态请求集合来轻松实现相同的功能,WCF服务和辅助服务访问的方式与我们使用数据库的方式非常相似。

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

+0

我想你已经死了。我正在考虑使用数据库表作为消息队列流,但我担心与数据库记录有关的开销(查看N个客户端如何与其服务器进行通信)。你的“忘记提及”是我认为的最好的计划,因为我可以使用静态队列结构排队消息,而不是将它们坚持在完成后没有价值的地方。这样,如果我使用正确的线程锁定过程,我可以访问静态消息并根据需要将它们出队。非常感谢。 – jermny 2011-12-16 01:56:59

相关问题