2008-09-16 2 views
0

В моем веб-приложении есть процесс, который запрашивает данные со всего Интернета, фильтрует его и сохраняет его в базе данных. Как вы можете себе представить, этот процесс занимает некоторое время. Мое текущее решение - увеличить тайм-аут страницы и дать пользователю индикатор выполнения AJAX во время загрузки. Это проблема по двум причинам: 1) она по-прежнему занимает много времени, и пользователь должен ждать 2) она иногда еще не работает.Каков наилучший способ обработки долгого процесса в приложении ASP.Net?

Я проболтался в процессе обработки и прочитал, что должен асинхронно публиковать его в веб-службе («Огонь и забыть»).

Некоторые ссылки я прочитал:
- MSDN
- Fire and Forget

Так что мой вопрос - что это лучший способ?

UPDATE: после ввода пользователем своих данных я хотел бы перенаправить их на страницу результатов, которая постепенно обновляется по мере того, как процесс выполняется в фоновом режиме.

ответ

7

Чтобы избежать чрезмерной архитектуры астрономии, я часто бывал use a hidden iframe to call the long running process and stream back progress information. В сочетании с чем-то вроде jsProgressBarHandler вы можете легко создать отличную индикацию прогресса вне диапазона для более длительных задач, где общая анимация прогресса не сокращает ее.

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

Например, вызов LongRunningProcess.aspx? TaskID = 1 пнуть его, а затем в конце этой задачи, испускают

document.location = "LongRunningProcess.aspx?taskID=2". 

объявление тошноты.

1

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

+0

Какой метод вы использовали? «Огонь и забыть»? Вы создали веб-сервис и украсили метод с помощью атрибута [SoapDocumentMethod (OneWay = true)]? – 2008-09-16 14:46:03

0
  1. Как вы запрашиваете удаленные данные?
  2. Как часто это происходит?
  3. Являются ли результаты тем, что можно было кэшировать в течение определенного периода времени?
  4. Как долго мы говорим здесь о времени?

«лучший способ», вероятно, зависит в какой-то мере на ответы на эти вопросы ...

+0

1. Большинство данных собрано через запросы XMLHTTP для RSS-каналов/веб-служб. 2. У меня есть процесс, который выполняется каждые пять минут, который обновляет базу данных. Проблема в том, что пользователь сначала создает свой запрос, который должен ждать. – 2008-09-16 14:50:48

+0

3. Да, они могут быть кэшированы - но это не поможет там, где проблема (когда пользователь создает запрос) 4. В зависимости от их ввода может быть от 30 секунд до нескольких минут – 2008-09-16 14:51:28

2

У нас была аналогичная проблема, и решить ее, начав работу через вызов asychronous веб-службы (что означало, что пользователю не пришлось ждать завершения работы). Затем веб-служба запустила SQL-задание, которое выполнило работу и периодически обновляло таблицу со статусом работы. Мы предоставили пользовательский интерфейс, который позволил пользователю запросить таблицу.

0

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

+0

Итак, как получается поток закрыто? Как вы знаете, когда поток завершен? У вас есть образец кода? – 2008-09-16 14:56:21

0

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

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

+0

Мне нравится это решение. что вы подразумеваете под «внебиржевым сервисом»? Я хотел бы опубликовать это в webservice и перенаправить на страницу результатов, где она будет инкрементно обновляться во время процесса – 2008-09-16 14:57:26

0

Добавьте задание с соответствующими параметрами в таблицу очередей заданий. Затем запишите службу Windows, которая подберет эти задания и обработает их, сохранит результаты в соответствующем месте и отправит запрос реквестеру со ссылкой на результаты. Также приятно прикоснуться к некоторому пользовательскому интерфейсу, чтобы пользователь мог проверить статус своей работы.

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

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