WCF 中长时间运行进程的进度通知 - 如何?
Posted
技术标签:
【中文标题】WCF 中长时间运行进程的进度通知 - 如何?【英文标题】:Progress notification in WCF for long running processes - How? 【发布时间】:2011-06-08 15:56:20 【问题描述】:我必须设计并实现一种方法来处理客户端/服务器应用程序中长时间运行的进程。一个典型的长时间运行的过程将/可能需要 2-3 分钟。同时,我还需要向 UI 报告进度并保持 UI 响应。
想到这些,我想到了一些解决方案:
一个异步请求启动进程,该进程启动服务器端进程并返回分配的 LRPID(长期运行进程 ID)然后使用该 LRPID 从客户端定期轮询。 (专业版:部署简单,没有防火墙干扰缺点:不优雅,消耗资源等)
使用双工绑定(例如 NetTcpBinding)并在取得进展时从服务器发起回调(Pro:优雅、高效、Con:部署噩梦)
[你的建议???]
您对此有何看法?
【问题讨论】:
客户端应用是用什么写的? 部署噩梦?为什么,因为 IIS/WAS?然后不要使用它们。 @Daniel Auger:客户端应用程序是用 WPF 编写的 @Allon Guralnek:由于在防火墙中打开端口,在客户端上托管“迷你服务器”以准备回调等。 您必须使用任何 WCF 服务来执行此操作。 【参考方案1】:这是 Dan Wahlin 撰写的post,介绍了如何为 Silverlight 应用程序创建 WCF 进度指示器。这应该会有所帮助。
【讨论】:
看起来很酷,我得再看看它。谢谢! 好吧,这被证明是最好的中间方式!尤其是因为"... It initiates a network request, and then the request is effectively “put to sleep” waiting for the server to respond (it doesn’t come back immediately). The server then keeps the connection open but not active until it has something to send back (or the connection times out after 90 seconds – at which point the duplex client will connect again and wait). This way you are avoiding hitting the server repeatedly – but still get an immediate response when there is data to send."
或者换句话说,一个已经实现的、轻量级且有效的轮询系统,模拟真正的双向版本【参考方案2】:
如果您不想担心客户端的防火墙等...我可能会选择您的第一个解决方案并使用BackGroundWorker 进行调用,以免阻塞 UI 线程。我最近为一个应用程序执行了此操作,其中生成报告的请求被放置在队列中,并在完成后被检索。它似乎运作良好。
【讨论】:
【参考方案3】:另一种方法(无需更改 WCF 绑定)是在 WPF 客户端中使用 WebBrowser 控件,并使用 SignalR 将进度消息从服务器发布到该控件。
请注意,为避免 WebBrowser 控件发生 javascript 错误(因为默认情况下,它似乎使用与 jQuery.js 不兼容的 Internet Explorer 版本 7),您需要向注册表添加键在客户端计算机上将客户端应用程序的默认设置更改为使用 IE10 或更高版本 - 请参阅 http://weblog.west-wind.com/posts/2011/May/21/Web-Browser-Control-Specifying-the-IE-Version)。 这可能是一个部署麻烦(因为似乎需要管理员权限 - 例如在 64 位 Windows 8.1 电脑上 - 添加注册表项)。 此外,似乎仍然需要在单独的线程中调用长时间运行的 WCF 方法,否则 WebBrowser 控件似乎不会更新其显示以显示它正在接收的 SignalR 消息。 (这是有道理的,否则 UI 线程将不得不等到 WCF 调用完成)。
但我提到它是使用更新工具 (SignalR) 的替代方法:)
【讨论】:
以上是关于WCF 中长时间运行进程的进度通知 - 如何?的主要内容,如果未能解决你的问题,请参考以下文章