2009-07-24 2 views
2

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

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

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

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

+0

У меня нет хорошего ответа для вас, но почему регистрация занимает так много времени? –

+0

Если я знаю. Я также хотел бы узнать, почему загрузка 40kB из .LLs занимает несколько минут: b – BCS

+5

Если ваш журнал настолько дорог, что требует отдельного процесса/потока, и вы не знаете, почему любое решение, которое вы получаете здесь, будет ставить бандаж на сломанную ногу. –

ответ

9

Это, кажется, работает:

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!"); 
} 

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

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

+0

Кажется, все работает нормально. – BCS

1

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

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

+1

Я знаю об AJAX, и это не то, что я ищу. Что касается ASP.NET + Async, я получаю тоны результатов для выполнения задачи асинхронно *, в то время как страницы загружаются *, а не после. – BCS

+1

См. Edit: Проблема связана с сервером, а не с клиентской стороной. – BCS

+0

Итак, почему бы не полностью загрузить страницу, а затем удалите процесс ajax, который вызывает ваш сервер, чтобы начать регистрацию или какой-либо другой метод, который вы хотите? AJAX - это процесс Async, который может вызывать любой метод на основе сервера. – Jay

1

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

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

+0

Это может не работать во всех браузерах (в зависимости от того, как они буферизуются) и/или продолжать делать статус браузера, что-то сказать по строке «Загрузка ...» –

+0

Кажется, что это может сработать. Могу ли я безопасно сделать это из 'Page_Load'? (/ me going the Googleing для получения потока ответов) – BCS

+0

Response.Flush отправляет контент клиенту по мере его рендеринга, будьте осторожны с этим, потому что если ваш журнал замедляет процесс, тогда страница будет медленно загружаться для ваших клиентов, когда завершается ведение журнала для этого раздела. Кусочки за раз. – Jay

1

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

Может быть, это HOWTO поможет вам:

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

надежда может помочь вам

0

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

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

+0

Как бы то ни было, я уже только регистрирую в конце ... – BCS

+0

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

0

Что это за журнал и где он собирается?

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

3

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

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

+0

Немного сложнее, чем решение Торарина, но все же вариант. – BCS

+0

Или попробуйте комбинацию: Решение Thorarin's + вызвать метод ведения журнала в отдельном потоке, чтобы ваш запрос мог быть выполнен с точки зрения IIS. –

Смежные вопросы