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

jer*_*mny 5 c# wcf multithreading design-patterns

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

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

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

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

com*_*ech 3

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

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

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

负责生成报告的服务定期轮询该表,当发现新条目时,它会派生一个新的线程/进程来生成报告。

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

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

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

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

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

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

忘记提及:

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

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