Progress Indicator с динамическим обновлением
От: Glenn  
Дата: 08.08.12 11:31
Оценка:
У меня есть ASP.NET WebForms приложение (с использованием DevExpress v 10.2).
Там у меня возникла такая задача: прив ыполнении некоей длительной (на стороне сервера) операции показывать Progress Indicator С ПРОМЕЖУТОЧНЫМИ СОСТОЯНИЯМИ. То есть;
— пользователь нажимает кнопку Start;
— на экране у него возникает некий индикатор показывающий степень завершения операции: 1%, 5%, ...., 100%. Этот индикатор обновляется достаточно часто — скажем, каждые 3 сек — и показывает как продвинулась эта операция.

Я не нашёл ни в ASP.NET WebForms Controls ни в DevExpress какого-то компонента который полностью решает эту задачу. Поэтому придумал следующее:

1. На странице завожу Progress Indicator в виде например DX-комонента ASPxProgressBar. Он помещён в панель ASPxCallbackPanel (думаю можно иcпользовать и стандартный AJAX UpdatePanel, просто я привык к DX).
2. При нажатии на кнопку Start мой JavaScript выполняет PerformCallback('Start') для этой панели ASPxCallbackPanel
3. На сервере обработчик этой ASPxCallbackPanel принимает callback с этим параметром 'Start' и запускает мою серверную 'длинную' операцию в отдельном потоке.
4. Внутри этой же ASPxCallbackPanel существует скрытое поле HiddenField. Через него сервер сообщает клиенту что операция закончена — скажем, поставив ему значение 'Completed'.
5. На клиентской стороне есть JavaScript-обработчик события EndCallback в панели ASPxCallbackPanel. Этот обработчик работает так: если он видит что HiddenField=='Completed', то просто завершается. Иначе — ждёт три секунды и выдаёт ASPxCallbackPanel.PerformCallback('Update')
6. Серверный обработчик панели ASPxCallbackPanel, видя на входе аргумент 'Update', смотрит — как далеко продвинулся прогресс задачи (работающей в отдельном потоке, как было сказано). Если она уже закончена, выставляет HiddenField='Completed'. Если ещё нет, вычисляет её прогресс в процентах и устанавливает этот процент в тот контрол ASPxProgressBar.

Прототип работает. Тем не менее хотелось бы знать — может я 'изобрёл велосипед' и всё можно сделать гораздо проще?
Glen
progress_indicator
Re: Progress Indicator с динамическим обновлением
От: Glenn  
Дата: 09.08.12 18:37
Оценка:
Здравствуйте, Glenn, Вы писали:

G>У меня есть ASP.NET WebForms приложение (с использованием DevExpress v 10.2).

G>Там у меня возникла такая задача: прив ыполнении некоей длительной (на стороне сервера) операции показывать Progress Indicator С ПРОМЕЖУТОЧНЫМИ СОСТОЯНИЯМИ. То есть;
G>- пользователь нажимает кнопку Start;
G>- на экране у него возникает некий индикатор показывающий степень завершения операции: 1%, 5%, ...., 100%. Этот индикатор обновляется достаточно часто — скажем, каждые 3 сек — и показывает как продвинулась эта операция.

G>Я не нашёл ни в ASP.NET WebForms Controls ни в DevExpress какого-то компонента который полностью решает эту задачу. Поэтому придумал следующее:


G>1. На странице завожу Progress Indicator в виде например DX-комонента ASPxProgressBar. Он помещён в панель ASPxCallbackPanel (думаю можно иcпользовать и стандартный AJAX UpdatePanel, просто я привык к DX).

G>2. При нажатии на кнопку Start мой JavaScript выполняет PerformCallback('Start') для этой панели ASPxCallbackPanel
G>3. На сервере обработчик этой ASPxCallbackPanel принимает callback с этим параметром 'Start' и запускает мою серверную 'длинную' операцию в отдельном потоке.
G>4. Внутри этой же ASPxCallbackPanel существует скрытое поле HiddenField. Через него сервер сообщает клиенту что операция закончена — скажем, поставив ему значение 'Completed'.
G>5. На клиентской стороне есть JavaScript-обработчик события EndCallback в панели ASPxCallbackPanel. Этот обработчик работает так: если он видит что HiddenField=='Completed', то просто завершается. Иначе — ждёт три секунды и выдаёт ASPxCallbackPanel.PerformCallback('Update')
G>6. Серверный обработчик панели ASPxCallbackPanel, видя на входе аргумент 'Update', смотрит — как далеко продвинулся прогресс задачи (работающей в отдельном потоке, как было сказано). Если она уже закончена, выставляет HiddenField='Completed'. Если ещё нет, вычисляет её прогресс в процентах и устанавливает этот процент в тот контрол ASPxProgressBar.

G>Прототип работает. Тем не менее хотелось бы знать — может я 'изобрёл велосипед' и всё можно сделать гораздо проще?


Нашёл также пример http://codecentral.devexpress.com/E918/. Основное отличие — там есть 'длинный' Callback который выполняет всю 'длинную' операцию; и одновременно — постоянно периодически посылаются 'короткие' Callback-и, возвращающие прогресс этой операции.

Думаю что у варианта http://codecentral.devexpress.com/E918/ есть свой недостаток — 'длинный' Callback может просто 'отвалиться' из-за истечения таймаута — например серверного, который задаётся в web.config->executionTimeout. Кроме того, я знаю есть и браузерные таймауты. Интересно, какие ещё? Есть ли таймауты proxy у клиента?
Моя же схема такой опасности не имеет — все мои Callback-и — 'короткие'
Glen
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.