Обновление приложения Silverlight во время использования на клиентах

У меня есть приложение Silverlight 5, которое связывается с сервером с помощью службы WCF.

Большинство пользователей, использующих приложение, запускают его в браузере (в основном это Internet Explorer, но также используются и другие браузеры), а некоторые устанавливают его OOB (Out Of Browser).

Когда приложение запускается, оно проверяет наличие новых версий и обновляет при необходимости. Здесь нет ничего необычного.

Время от времени, в основном по вечерам и выходным, я обновляю решение. Это могут быть изменения в базе данных, изменения в службе WCF, изменения в самом приложении Silverlight или их совокупность. И в большинстве случаев это абсолютно не проблема.

Моя проблема в том, что некоторые пользователи никогда не закрывают свой веб-браузер. Некоторые пользователи даже работают через окно Citrix, закрывают окно Citrix и возвращаются домой после работы, позволяя приложению Silverlight работать и существовать в веб-браузере. А некоторые просто не закрывают браузер вообще. Или, если они запускают OOB, они оставляют приложение открытым. Это моя проблема. Потому что они никогда не будут проверять наличие новых обновлений. Приложение Silverlight никогда не будет обновляться, а также не подходит для новой службы WCF, которая может быть обновлена.

Все это приводит к сбою приложений Silverlight и странным исключениям, потому что мир вокруг изменился.

Кто-нибудь сталкивался с подобными проблемами и действительно нашел хорошее решение?

Я пытался:

  • Создание таймера, который сбрасывается при любом щелчке клавиатуры или мыши и выходит из приложения через определенный промежуток времени без каких-либо действий. Но кажется, что этот таймер иногда не учитывается, например, когда он отключен от сеанса RDP или Citrix.

  • Проверка обновлений каждый раз, когда отображается определенный элемент управления или окно. Но это не очень хорошее решение, потому что не все пользователи могут использовать одно и то же. Это может также прервать пользователя, если он работает с чем-то.

Но все они кажутся мне немного безрассудными обходными путями.

Любые предложения, кто-нибудь?

1 ответ

Решение

Перезапуск таймера, пока пользователь активен, не имеет смысла для меня. Что если они активны на момент выпуска обновления? Конечно, лучше прерывать, чем падать приложение?

Лучше запустить таймер с фиксированным интервалом. Было бы позвонить CheckAndDownloadUpdateAsync и подскажите пользователю, требуется ли перезагрузка.

В некоторых случаях, когда таймер не запускается или между интервалами публикуется критическое обновление, вы можете попробовать выполнить логику обновления в App.Application_UnhandledException метод. Только не забудьте пометить событие как обработанное, если вы обнаружите, что обновление действительно установлено...

Таким образом, вы должны иметь полное покрытие.


Редактировать: для приложений In-Browser вам нужно беспокоиться только о том, когда обновлять страницу, так как этого может быть достаточно, чтобы XAP был последним.

Ваш таймер может вызвать некоторый JavaScript для достижения этой цели, но я думаю, что было бы лучше просто вызвать обновление в App.Application_UnhandledException событие. Вы можете написать состояние в IsolatedStorage заранее, если вы действительно хотите сделать это без проблем.

Другие вопросы по тегам