2010-10-14 4 views
0

Мне нужно запустить поток, чтобы выполнить некоторую длительную задачу в фоновом режиме (даже если браузер закрыт), не дожидаясь ответа на событие нажатия кнопки на веб-странице.запуск и остановка потоков из ASP.NET

Я также должен быть в состоянии остановить это позже, если пользователь захочет это сделать.

Как я могу это сделать?

Можно ли сохранить id из потока в базе данных и прервать его позже?

Нужно ли делать асинхронный webservice ИЛИ wcf позвонить, чтобы добиться этого?

Как я могу остановить долговременную задачу позже, если это необходимо в этом случае?

Заранее спасибо.

ответ

2

Я предлагаю, чтобы ваше приложение ASP.Net записывало запросы в таблицу базы данных и обрабатывало эти запросы службой Windows.

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

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

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

+0

Это то, что я почти решил из-за различных проблем (например, балансировки нагрузки и т. Д.) В управлении долгосрочными задачами на веб-сервере. служба Windows может запускать несколько потоков для параллельного выполнения задач. единственная проблема с сервисом Windows заключается в том, что ему нужно постоянно проверять базу данных каждую секунду или несколько минут, чтобы проверить новые запросы, которые неэффективны в нерабочее время, будет лучше, если это каким-то образом управляется событием, как событие публикуется, когда пользователь делает запрос, а услуга подписывается на него и действует ТОЛЬКО при появлении нового запроса. мне нужно использовать MSMQ для этого? – RKP

+0

Вы можете попробовать MSMQEvent и посмотреть, работает ли он на вас. Опрос не должен накладывать большую нагрузку на сервер, если вы не постоянно его забиваете. Вы можете отступить на интервал в нерабочее время, если это очень важно. Но цель машин - делать что-то, поэтому, если он не делает ничего другого, что не так с некоторым опросом? –

+0

спасибо за ответ – RKP

0

Вы можете использовать backgroundworker класс:

Инстанцировать в BackgroundWorker, определить обработчик DoWork события и обработчик события RunWorkerCompleted. Затем запустите действие, используя метод RunWorkerAsync. Вы можете отменить действие, используя метод CancelAsync.

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

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