WCF中针对长时间运行的进程的进度通知 - 如何?

时间:2011-01-13 17:33:24

标签: wcf notifications progress-bar polling duplex

我必须设计并实现一种处理客户端/服务器应用程序中长时间运行的进程的方法。典型的长时间运行过程可能需要2-3分钟。我还需要在此期间向UI报告进度并保持UI响应。

在我的脑海中,我想到了一些解决方案:

  • 启动进程的一个异步请求,启动服务器端进程并使用该LRPID定期从客户端返回已分配的LRPID(长时间运行进程ID)然后轮询。 ( Pro :部署简单,没有防火墙搞乱 Con :不雅,资源消耗等。)

  • 使用双面绑定(例如NetTcpBinding)并在进行中时启动来自服务器的回调( Pro :优雅,高效, Con :部署恶梦)

  • [你的建议???]

您对此有何看法?

3 个答案:

答案 0 :(得分:4)

以下是Dan Wahlin关于如何为Silverlight应用程序创建WCF进度指示器的post。这应该有所帮助。

答案 1 :(得分:1)

如果您不想担心客户端的防火墙等...我可能会使用您的第一个解决方案并使用BackGroundWorker进行调用以防止阻止UI线程。我最近为一个应用程序执行了此操作,其中生成报告的请求被放入队列并在完成后检索。它似乎运作良好。

答案 2 :(得分:0)

另一种方法(无需更改WCF绑定)是在WPF客户端中使用WebBrowser控件,而SignalR则将进度消息从服务器发布到该控件。

请注意,为了避免WebBrowser控件发生的javascript错误(因为默认情况下它似乎使用的Internet版本7似乎与jQuery.js不兼容),您需要向注册表添加密钥在客户端计算机上更改客户端应用程序的默认值以使用IE10或更高版本 - 请参阅http://weblog.west-wind.com/posts/2011/May/21/Web-Browser-Control-Specifying-the-IE-Version)。 这可能是部署麻烦(因为似乎需要管理员权限 - 例如在64位Windows 8.1 PC上 - 添加注册表项)。 此外,似乎仍然需要在单独的线程中调用长时间运行的WCF方法,否则WebBrowser控件似乎不会更新其显示以显示它正在接收的SignalR消息。 (这是有道理的,因为UI线程否则必须等到WCF调用结束)。

但我提到它是使用更新工具(SignalR)的替代方法:)