Может ли страница ASP.NET выполнить часть своей обработки после завершения загрузки страницы?

StackOverflow https://stackoverflow.com/questions/1179666

  •  19-09-2019
  •  | 
  •  

Вопрос

У меня есть ASP.NET страница, загрузка которой занимает слишком много времени.Небольшое тестирование показывает, что серверная сторона ведение журнала занимает довольно много времени и (поскольку пользователю никогда не нужно видеть результаты ведения журнала) Я хочу отложить это до тех пор, пока страница не загрузится.

Есть ли простой способ сделать это?

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

Я такой НЕ ищу АЯКСА.Я хочу выполнить обычную полную загрузку страницы, а затем после загрузки страницы (как видно со стороны клиента) выполнить еще немного обработки.

Это было полезно?

Решение

Похоже, это работает:

protected void Page_Unload(object sender, EventArgs e)
{
    HttpContext.Current.Response.Flush();
    HttpContext.Current.Response.Close();
    Thread.Sleep(20000); // Do processing here instead of sleeping :)
    Debug.WriteLine("Done!");
}

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

В этом могут быть некоторые недостатки, так как процесс, обрабатывающий запрос, остается занятым и не может обработать следующий HTTP-запрос.Однако IIS7 имеет настраиваемое ограничение на количество одновременных запросов.Вы хотели простоты, я думаю, это настолько просто, насколько это возможно.

Другие советы

Рассматривали ли вы возможность создания службы ведения журнала, которая принимает очередь сообщений для регистрации и просто выполняет ведение журнала в своем собственном потоке?

Используя это, вы можете оставить все протоколирование там, где оно было в коде раньше, и просто выполнять асинхронные вызовы методов протоколирования.

Вы ищете асинхронный процесс.AJAX допускает это, а также другие реализации.Выполните поиск по Async и ASP.Net, и вы найдете массу ресурсов.

По сути, ваша веб-страница запускается и запускает процессы в отдельном потоке, в то время как пользовательский интерфейс продолжает визуализироваться.

Попробуйте вызвать Flush в потоке ответов перед входом в систему.Выгрузка не запускается до тех пор, пока не будет отправлен весь ответ.Если вы тут же сбросите(), а затем войдете в систему, это должно быть последнее, что делает страница.

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

Это возможно с помощью асинхронных потоков.Мы создали Страницу для клиента, который каждые 2 минуты проверяет, есть ли обновление, и если да, то мы обновили страницу.

Может быть, это руководство поможет вам:

http://www.eggheadcafe.com/articles/20060918.asp

надеюсь, это могло бы помочь вам

Вместо того чтобы записывать это в свой журнал, создайте из этого строку (используя StringBuilder) и ближе к концу вставьте всю эту строку в журнал.

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

Что это за ведение журнала и куда оно направляется?

Одним из способов может быть выделение другого потока (вам нужно будет увеличить количество потоков, доступных для asp.net) и выполнить вход в систему там.Вы могли бы использовать ParameterizedThreadStart и передать объект, который будет использоваться для ведения журнала.(Однако не передавайте объект подключения к базе данных / command, это было бы плохо!)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top