2011-01-13 52 views
7

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

在我的脑海里有了这些我虽然少数的解决方案:

  • 一个异步请求开始这将启动服务器端进程,并返回一个分配LRPID(长时间运行的进程ID)则处理使用该LRPID从客户端定期轮询。 (:部署简单,没有防火墙瞎搞精读:Unelegant,资源消耗等)

  • 使用一个双螺旋结合(如NetTcpBinding的),并且正在取得进展从服务器发起回调( :优雅,高效,精读:部署恶梦)

  • [你的建议???]

你会怎么做?

+0

什么是客户端应用程序写入? – 2011-01-13 19:02:47

+0

部署噩梦?为什么,因为IIS/WAS?那就不要使用它们。 – 2011-01-13 20:51:40

回答

4

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

1

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

0

的另一种方式(而不必改变WCF结合)是在WPF客户端使用web浏览器控件,以及SignalR从服务器到该控制后进度消息。

请注意,为了避免发生WebBrowser控件发生JavaScript错误(因为默认情况下它似乎使用Internet Explorer版本7,它似乎与jQuery.js不兼容),您需要将密钥添加到在客户端机器上注册表以更改客户端应用程序的默认值以使用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)的替代方法:)

相关问题