Как я могу обновить сообщения о прогрессе при обработке данных в ASP.NET? - PullRequest
5 голосов
/ 27 марта 2010

У меня есть процесс, который выводит пошаговые сообщения (т. Е. Элемент обработки 1 ... ошибка в элементе 2 и т. Д. И т. Д.).

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

Я почти уверен, что мне нужно сделать это с многопоточностью, но не могу найти достойного примера.

1 Ответ

6 голосов
/ 27 марта 2010

Это не проблема потоков, а проблема веб-браузера. Вы хотите, чтобы браузер отображал статус во время работы на сервере. Теоретически вы можете сделать что-то вроде:

Response.Write("something");
Response.Flush();

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

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

Проверьте Индикатор выполнения в реальном времени с ASP.NET AJAX для выполнения индикатора прогресса ajax с ajax и .net.

В этой статье приведен отличный пример создания индикатора выполнения с помощью обработчика http: http://www.asp101.com/articles/matt/progressbar/default.asp

Чтобы доказать мою точку зрения, следующий код работает в Firefox, но не в IE или Chrome:

protected void Page_Load(object sender, EventArgs e)
{
    Response.Buffer = false;
    Response.Clear();
    Response.Write("<html><body>");
    Response.Write("1\n");
    Response.Flush();
    Thread.Sleep(2000);
    Response.Write("1\n");
    Response.Flush();
    Thread.Sleep(2000);
    Response.Write("1\n");
    Response.Flush();
    Thread.Sleep(2000);
    Response.Write("1\n");
    Response.Flush();
    Response.Write("</body></html>");
    Response.End();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...