2016-10-31 3 views
3

Я понимаю, что этот вопрос задавался в разных вариантах, но с новыми функциями .net (например, async жду). Интересно, какое решение является лучшим.Длительный процесс в веб-формах ASP.NET - время ожидания браузера

У меня есть приложение C# .Net Web Forms, у которого есть длительная работа: задача обрабатывает запрос пользователя, где они загружают файл данных csv, сериализуется в объект и импортирует в базу данных. Задача может занять несколько минут, и браузер регулярно отключается - это вызывает проблемы с удобством использования.

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

Я хотел бы знать, как это достигается? Параметры, которые я вижу на столе:

  • службы Windows
  • Web Service - как это организовано: IIS или службы Windows?
  • Async, Await - это возможность?

ответ

1

Я думаю, вы могли бы принять два разных подхода.

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

Второй может быть подход с толчком, который немного сложнее, но дает вам другие возможности. Вам нужно будет использовать библиотеку, такую ​​как signalr https://www.asp.net/signalr, которая позволяет вам связываться с сервером в браузере клиента, вызывать функции JS и нажимать обновленное состояние в форме клиента. Это может создать более функциональную двухстороннюю связь и улучшить пользовательский интерфейс в обмен на немного сложнее.

+0

благодарит за комментарий. Где бы вы предложили мне запустить этот процесс? Как я уже сказал, если я делаю это непосредственно в APP, поток привязан, и браузер зависает до завершения. – David

+0

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

+0

Мне удалось найти решение, запустив эти процессы в параллельный поток, а затем делает ajax вызовы для процесса с небольшими интервалами для запроса обновления хода. Однако я не уверен, что использую правильную технику. Раньше я думал, что я должен использовать какой-то сервис здесь. – David