Каков наилучший способ обработки длительных процессов в приложении ASP.Net?

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

  •  09-06-2019
  •  | 
  •  

Вопрос

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

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

Некоторые ссылки, которые я прочитал:
- MSDN
- Стреляй и забудь

Итак, мой вопрос в том, каков наилучший метод?

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

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

Решение

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

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

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

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

До тошноты.

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

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

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

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

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

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

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

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

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

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

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