Это не проблема с потоками, а проблема с пользовательским интерфейсом веб-браузера. Вы хотите, чтобы браузер отображал статус, когда вы работаете на сервере. Теоретически вы могли бы сделать что-то вроде:
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();
}
person
Mikael Svenson
schedule
27.03.2010