在WCF服务和单独的线程之间进行通信的最佳方式是什么?

时间:2011-12-16 01:29:25

标签: c# multithreading wcf design-patterns

问题的措辞不一定是正义问题......

  • 我有一个客户端UI,坐在本地盒子上,后台窗口服务支持它,同时执行后台功能。
  • 客户端用户界面只是表示层,而Windows服务则执行所有强力点击操作......因此需要在两者之间进行通信。在google上花了一段时间并阅读最佳实践后,我决定使用WCF和命名管道来创建服务层。
  • 客户端UI是WCF客户端,Windows服务充当WCF主机(仅在本地托管)以支持客户端。

所以这应该没问题。客户端UI可以将数据传递给WCF主机。但我的问题是,我如何使这些数据有用? 我在Windows服务/ WCF主机上运行了几个引擎但是WCF主机完全没有意识到任何后台引擎的存在。我需要客户端的通信请求才能与这些引擎交互发动机。

是否有人知道如何在WCF主机和正在运行的线程之间进行通信的良好设计模式或方法?

1 个答案:

答案 0 :(得分:3)

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

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

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

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

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

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

这种机制允许我们做一些事情:

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

2)给定的服务可以支持众多客户。

3)通过WCF界面,我们可以将此支持扩展到我们选择支持的任何客户端平台(网络,赢取,平板电脑,手机等)。

忘记提及:

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

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