问题的措辞不一定是正义问题......
所以这应该没问题。客户端UI可以将数据传递给WCF主机。但我的问题是,我如何使这些数据有用? 我在Windows服务/ WCF主机上运行了几个引擎但是WCF主机完全没有意识到任何后台引擎的存在。我需要客户端的通信请求才能与这些引擎交互发动机。
是否有人知道如何在WCF主机和正在运行的线程之间进行通信的良好设计模式或方法?
答案 0 :(得分:3)
我认为您最好的办法是拥有一些静态属性或方法,可用于在服务线程/进程和WCF服务之间交换数据。
或者,我们处理此问题的方法是通过使用数据库,其中客户端或wcf服务将服务请求排队,并且服务在可用时,使用对这些服务的响应更新数据库。要求。然后,客户端定期轮询数据库(通过WCF)以检索任何未完成请求的结果。
例如,如果客户端需要生成报告,我们将通过WCF发出请求,WCF会在数据库中创建报告生成请求。
负责生成报告的服务定期轮询此表,当它找到新条目时,它会旋转生成报告的新线程/进程。
报告完成后(成功或失败),服务会使用结果更新数据库表。
同时,如果任何提交的报告尚未完成,客户端会定期询问WCF服务。 WCF服务依次轮询表中已完成但尚未交付给客户端的任何请求,从中收集信息,并将它们返回给客户端。
这种机制允许我们做一些事情:
1)随着工作量的增加,我们可以在多个物理/虚拟机上扩展处理这些请求的服务数量。
2)给定的服务可以支持众多客户。
3)通过WCF界面,我们可以将此支持扩展到我们选择支持的任何客户端平台(网络,赢取,平板电脑,手机等)。
忘记提及:
仅仅因为我们选择使用数据库并不意味着你必须为了实现这种模式。您可以通过创建WCF服务和工作服务访问的静态请求集合来轻松实现相同的功能,其方式与我们使用数据库的方式非常相似。
您只需要非常小心地正确获取和释放静态属性上的锁,以避免跨线程冲突或死锁。