1

我有一个 Silverlight 5 应用程序,它通过 WCF 服务与服务器通信。

大多数使用该应用程序的用户在浏览器中运行它(主要是 Internet Explorer,但也使用其他浏览器),少数用户安装它 OOB(浏览器外)。

当应用程序启动时,它会检查更新的版本并在必要时进行升级。这里没有什么不寻常的。

不时地,主要是在晚上和周末,我对解决方案进行升级。这可能是数据库中的更改、WCF 服务中的更改、Silverlight 应用程序本身的更改,或所有这些的混合。在大多数情况下,这绝对没有问题。

我的问题是有些用户从不关闭他们的网络浏览器。有些用户甚至通过 Citrix 窗口工作,下班后只关闭 Citrix 窗口回家,让 Silverlight 应用程序运行并存在于 Web 浏览器中。有些根本不关闭浏览器。或者,如果他们运行 OOB,他们会让应用程序保持打开状态。这些是我的问题。因为他们永远不会检查新的更新。Silverlight 应用程序永远不会升级,也不适合可能升级的新 WCF 服务。

这一切都使 Silverlight 应用程序崩溃并抛出奇怪的异常,因为周围的世界已经发生了变化。

有没有人遇到过类似的问题并且实际上找到了一个好的解决方案?

我努力了:

  • 创建一个计时器,该计时器在任何键盘或鼠标单击时重置,并在给定时间段无活动后退出应用程序。但似乎这个计时器有时不算数,比如从 RDP 或 Citrix 会话进行 dosconnect 时。

  • 每次显示某个控件或窗口时检查更新。但这不是一个好的解决方案,因为所有用户可能不会使用相同的。如果他们正在处理某些事情,它也可能会打断用户。

但在我看来,它们都像是有点俗气的变通办法。

任何建议,有人吗?

4

1 回答 1

0

在用户处于活动状态时重新启动计时器对我来说没有意义。如果它们在发布更新时处于活动状态怎么办?当然,被打断总比让应用程序摔倒更好吗?

最好以固定的时间间隔运行计时器。CheckAndDownloadUpdateAsync如果需要重新启动,它将调用并提示用户。

对于计时器不运行或在间隔之间发布关键更新的边缘情况,您可以尝试在App.Application_UnhandledException方法中执行更新逻辑。只是不要忘记将事件标记为已处理,您发现确实有要安装的更新...

这样你应该有完整的覆盖范围。


编辑:对于浏览器内应用程序,您只需要担心何时刷新页面,因为这足以确保 XAP 是最新的.

您的计时器可以调用一些JavaScript来实现这一点,但我认为最好在App.Application_UnhandledException事件中简单地触发刷新。如果你真的想让它变得无缝,你可以事先将状态写入到 IsolatedStorage。

于 2013-01-30T20:38:01.687 回答