8

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

考虑到这些,我想到了一些解决方案:

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

  • 使用双工绑定(例如 NetTcpBinding)并在取得进展时从服务器发起回调(Pro:优雅、高效,Con:部署噩梦)

  • 【你的建议???】

您对此有何看法?

4

3 回答 3

4

这是Dan Wahlin 撰写的关于如何为 Silverlight 应用程序创建 WCF 进度指示器的帖子。这应该会有所帮助。

于 2011-01-13T21:54:49.807 回答
1

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

于 2011-01-16T21:27:43.660 回答
0

另一种方法(无需更改 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)的替代方法:)

于 2014-08-07T11:52:13.160 回答