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
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.