Как обновить веб-страницу с ходом выполнения серверной задачи? - PullRequest
3 голосов
/ 16 марта 2010

Я работаю над веб-проектом, который берет результаты из приложения типа опроса и проводит их через кучу вычислений, чтобы найти некоторые рекомендуемые рекомендации для пользователя.

Теперь, этот расчет может занять минуту или около того, поэтому я хотел бы иметь возможность дать пользователю некоторую обновленную информацию о его прогрессе. Очевидно, что быстрым и грязным решением было бы выложить сообщение типа «Пожалуйста, подождите, пока мы рассчитаем ваши рекомендации» с изображением типа вращающегося механизма. (или что-то еще, вы поняли ...). Когда задача будет выполнена, я перенаправлю вас на страницу результатов.

Тем не менее, я хотел бы сделать что-то более роскошное. Возможно, что-то похожее на индикатор выполнения, и даже подскажет пользователю, что происходит в фоновом режиме. Например, дайте им индикатор выполнения с текстом, который гласит: «Сейчас обрабатывается предложение 3 из 15; Мультивитамин»

Есть предложения, как мне это настроить? Один из способов сделать это - записать ход выполнения метода вычисления в HttpContext и запустить панель обновлений и таймер, который будет показывать / обновлять эту информацию. Я также проверил, может быть, создание веб-службы / метода, а затем опросить это через некоторый интервал.

Кто-нибудь делал что-то подобное раньше? Что сработало для вас?

Еще раз спасибо!

~ Jim

Ответы [ 3 ]

1 голос
/ 16 марта 2010

Если вы никогда не были на AjaxPatterns.org, то я бы посоветовал посетить его по порядку. Соответствующие материалы для чтения вы бы искали:

Индикатор прогресса

Это охватывает несколько шаблонов для достижения цели наряду с двумя, которые вы уже предложили. Если вам нужна индикация фактического прогресса, вам придется проделать немалую работу, но основная схема такова:

  1. Запустить долгосрочное задание (возможно, в отдельном потоке)
  2. Создайте общий ресурс, который указывает выполненную работу, и уникальный ключ, который может извлечь эту информацию. Это может быть сделано в памяти, базе данных, файловой системе ...
  3. Передать этот ключ клиенту
  4. На стороне клиента с определенным интервалом опрашивать обновления, используя этот ключ
  5. Обновить отображение клиента индикатором прогресса на основе значения вернулся.
0 голосов
/ 16 марта 2010

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

Одна вещь, которую мы сделали в прошлом, - это просто установили таймер обратного отсчета на странице (или индикатор выполнения и т. Д.) И некоторый вращающийся текст, который говорит что мы будем делать с данными, аля установщики. Он не обязательно специфичен для происходящего, но является общим, и мы можем периодически обновлять его на стороне сервера.

Если вы хотите пойти по первому пути, я бы предложил разделить вашу задачу анализа на процессы и обновить коллекцию в соответствии с ходом процесса, а затем, когда клиент перезвонит (через ajax, или refresh, или magic), вы просто верните им набор статусов, присвойте каждому статусу UID, и клиент сможет определить, нужно ли ему обновляться, таким образом, вы сможете увидеть множество изменений статуса, если они происходят между вызовами, и вы минимизируете работу, которую вам нужно сделать, чтобы сделать «процесс» сообщает о своем статусе.

0 голосов
/ 16 марта 2010

То, что вы предложили по поводу использования HttpContext, - это то, как большинство людей делают подобные вещи. Есть много способов прославить это, но это действительно то, что происходит.

Одним из таких способов было бы, чтобы вы регистрировали каждый из этих параллельных потоков в каком-то синглтоне (или что-то в этом роде) и регулярно (каждые 10 секунд?) Получали ваш AJAX-вызов ping в этом потоке, чтобы задать его как это происходит, что может вернуть процент завершения для вас, чтобы показать его пользователю. Но все же, за кадром это просто вызов AJAX. Вы МОЖЕТЕ даже изменить частоту своего чека, основываясь на каком-то ответе, который вы получаете, когда спрашиваете другую ветку, что случилось.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...