SharePoint 2010. Длительные операции с обновляемым статусом
Часть 1. SPLongOperation снаружи
Часть 2. SPLongOperation изнутри
Часть 3. SPLongOperation. Request timed out
Часть 4. Длительные операции с обновляемым статусом
В SharePoint 2010 есть класс SPStatefulLongOperation, который позволяет реализовать выполнение длительных операций с обновляемым статусом.
Сам класс унаследован от SPLongOperation и работает аналогично. В описании механизма работы класса SPLongOperation я писал, что трюк, заставляющий браузер ожидать выполнения операции заключается в отсутствии закрывающегося тега body. В отличие от своего родителя, класс SPStatefulLongOperation каждую секунду дописывает строку состояния в тело страницы. За это отвечает метод UpdateProgress:
- private void UpdateProgress(object state)
- {
- SPLongOperationState state2 = state as SPLongOperationState;
- string status = null;
- if (state2 != null)
- {
- status = state2.Status;
- }
- if (string.IsNullOrEmpty(status))
- {
- status = "<!-- -->";
- }
- HttpContext.Current.Response.Write(status);
- HttpContext.Current.Response.Flush();
- }
Во время выполнения операции пользователь видит примерно вот такой блок (в случае, если версия интерфейса равна 4):

Так как в Response мы можем только дописывать, но никак не изменять уже переданную информацию, то лучшим сценарием, на мой взгляд, здесь является передача клиентской стороне блока javascript-кода, который будет изменять текст в LeadingHTML и TrailingHTML.
Небольшой пример
Вот небольшой пример использования этого класса:
- SPStatefulLongOperation.Begin(
- "<span id='leadingHTML'>Что-то происходит</span>",
- "<span id='trailingHTML'>Все только началось</span>",
- op =>
- {
- op.Run(opState =>
- {
- // Инициализируем пустой статус
- opState.Status = string.Empty;
- // Выполняем операцию
- DoSomething();
- // Меняем статус
- opState.Status = string.Format(
- "<script type='text/javascript'>" +
- "document.all.item('leadingHTML').innerText = '{0}';" +
- "document.all.item('trailingHTML').innerText = '{1}';" +
- "</script>",
- "Что-то уже сделано",
- "Откиньтесь на спинку кресла");
- // Выполняем еще какую-нибудь операцию
- DoSomething2();
- });
- // При вызове метода End просто передаем URL для редиректа
- op.End("http://blog.vitalyzhukov.ru");
- });
В результате будут исполнены два метода (DoSomething и DoSomething2). Перед выполнением второго метода статус операции будет изменен, что дает возможность уведомить пользователя о текущем состоянии.









































