你有这种混乱是假定任务的执行和WCF端点是一样的。我将它分成三个主要项目:
- 具有用于作业管理的UI元素的客户端应用程序。
- WCF服务端点检索作业信息并发送创建/删除作业请求。
- 运行作业的应用程序。
客户端应用程序
客户端应用程序应通过WCF服务检索作业数据。您将提供屏幕查看执行作业/创造就业机会/删除作业/等
WCF服务
的WCF服务将公开由客户端应用程序所需的端点。这可能包括诸如以下项目:CreateJob,ViewJobs,DeleteJob等。该服务应该读取/写入您的数据库后端。
求职
申请工作将轮询新/删除的作业并执行一切必要的工作来完成。它将更新WCF服务读取的数据库后端的作业状态。这可能是一个SQL作业,Windows服务,控制台应用程序,等等,(我可能会让它成为一个Windows服务,因为你可能需要一直在运行的东西来处理作业)。
问题
How can a server console application expose ASMX or WCF web services(so that WPF clients get the status of the jobs) WHILE CONTINUING TO RUN THE JOBS?
通过运行该被取消职位的申请分离出WCF服务。注意:您可以拥有托管WCF和作业执行程序的控制台应用程序,但在概念上将它们视为单独的东西(托管在相同的控制台应用程序中仅仅是一个实现细节)。
How to push progress updates from server to the WPF clients when there is a change?
我不会这么做。我会让UI不时轮询或提供刷新按钮以通过WCF端点检索状态。
如果您绝对需要这样做,您需要Job执行者在运行作业时发布消息,并且客户端应用程序需要接收这些消息(可能是MSMQ,Service Bus Implementation,BizTalk等)。
为什么我喜欢轮询服务器推送
现在,我想它有可能情况下,我会做俯卧撑的风格,有些地方我投票。
如果我有很多异地客户端(通过VPN或通过互联网连接),我会让客户端进行轮询,因为带宽和网络延迟成本过高。如果客户端数量很高,则每条更新消息都需要发送给每个订阅客户端。在这种情况下,我倾向于去询问不告诉模型。
如果客户在家,你需要实时的信息流,那么推送模式会更有意义。在这种情况下,客户端可以连接到服务器应用程序,他们可以通过连接来回发送消息(我没有亲自做过这个,所以我没有建议如何设置,希望比套接字更高级别)。
如果这是一种情况,您希望消息作为更新发生,但客户端位于许多不同的地方,那么发布/订阅模型可能是最好的。在pub/sub中,应用程序会在更新消息发生时推送消息。消息传递系统将检查是否有任何订阅消息的客户端,并且所有订阅消息传递系统的客户端都将消息的副本转发给它们。在你的例子中,一个客户端将subscribe
作为消息,消息系统会将更新发送到客户端指定的位置(客户端需要一种接受消息的方式)。NServiceBus,BizTalk是这种类型的通信的例子。
可能的重复:http://stackoverflow.com/questions/11170457/discussion-client-server-application-architecture –
@MikeMcCaughan您提到的链接似乎是相似的,但它不是,在我的情况下,我的服务器除了为客户提供服务外,还有很长时间的工作要做。 – Aron
试试这个:http://dasunhegoda.com/architecture-products/1180/ – Techie