«Загрузка» веб-страницы для асинхронного вызова - PullRequest
4 голосов
/ 14 мая 2010

У меня есть простая веб-страница в ASP.NET / C #. В настоящее время для полной визуализации данных мне требуется вызвать блок кода, который выполняется в фоновых потоках и может занять несколько минут. Я получил его в точку (используя атрибут async в объявлении страницы), чтобы выполнить и вернуть нормально с HTML, как только это будет сделано. Я хотел бы, чтобы я сразу же вернулся с некоторой «загрузочной страницей» и затем обновил эту страницу после завершения фоновой работы. Прямо сейчас я ничего не получаю на странице, пока выполняется фоновая работа. Будем весьма благодарны за любые идеи относительно лучшего или умного способа сделать это!

Спасибо

Sieg

Ответы [ 3 ]

1 голос
/ 17 мая 2010

Я согласен с комментариями выше.

Я бы, однако, реализовал бы «процессор» как отдельную страницу, используя ashx (обработчик), поскольку их действительно просто вызывать и опрашивать из javascript, и вы просто кодируете вещи, поступающие в запросе процесса, в поток ответов.

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

По сути, в моем случае у меня есть страница, которая опирается на данные из: Би-би-си Google Амазонка YouTube некоторые другие случайные сайты.

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

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

Когда данные возвращаются, gif заменяется содержимым, передаваемым сервером.

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

Это чистый пользовательский опыт, и код действительно прост.

Я опрокинул идею, когда смотрел, как выполнять загрузку файлов с использованием silverlight.

Основная концепция:

  1. ajax вызов "ashx". (может быть, 10 строк JavaScript)
  2. сервер обрабатывает запрос. (зависит от сложности запроса, переменные передаются с использованием строки запроса)
  3. ответ заполняет 1 элемент на другой заполненной странице. (это делает ajax cllback)

Надеюсь, это поможет:)

0 голосов
/ 14 мая 2010

То, что вы хотите, называется HTTP-сервер Push или HTTP Streaming или Long Polling . В зависимости от того, как это сделано.

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

Вы также можете проверить этот SO вопрос о потоковой передаче HTTP ...

Кросс-браузерная реализация "потоковой передачи HTTP" (push) паттерна AJAX

Там есть ссылка на замечательную вступительную статью.

Или этот с примером Длинный опрос

Как реализовать базовый «длинный опрос»?

или

https://stackoverflow.com/questions/tagged/long-polling

Надеюсь, это поможет.

0 голосов
/ 14 мая 2010

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

<div>
    Loading..
    <% Response.Flush(); %>
    <% System.Threading.Thread.Sleep(5000); %>
    Done!
</div>
...