2012-01-15 2 views
1

Я читал асинхронную функцию/веб-страницы для ASP.NET 3.5 (мы пока не используем v4), но те, кого я видел, сосредоточены на выполнении фоновой задачи, но затем все еще вернулись, чтобы закончить и отправить ответ, после задача выполнена.ASP.NET (VB) Выполняет длинную функцию асинхронно, не блокируя нить страницы?

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

Каков наилучший способ сделать это? Я не могу найти примеры того, что вы могли бы назвать фоновой задачей «сирота» в ASP.NET.

Я думал о том, чтобы сделать это с помощью javascript Ajax-вызова на странице, которую я покажу пользователю, но информация, переданная веб-сервису, чувствительна, так что это не может быть и речи. Но это иллюстрирует то, что я хочу сделать.

[ed] Другая идея: Есть ли событие в модели ASP.NET, которое я могу использовать, которое происходит после ответ отправлен браузеру и соединение закрыто? то есть. Таким образом, больше обработки может произойти без ожидания пользователя?

ответ

2

Вы можете использовать темы ... если вы не заботитесь о реакции, просто использовать:

try 
{ 
Thread t = new Thread(new ThreadStart(yourMethodName)); 
t.Start(); 
} 
catch{} 
+0

Спасибо, не понял, что это было так просто. :) Однако, после изучения вариантов, я не понимаю разницу между a) 'Dim th As New Thread (New ThreadStart (Function() DoWork (param))),') 'Dim th As New Thread (DirectCast (Function() DoWork (param), ThreadStart)) 'и c)' ThreadPool.QueueUserWorkItem (Function() DoWork (param)) '. Все они, похоже, действуют одинаково. –

+0

Если я понимаю все правильно, использование ThreadPool.QueueUserWorkItem плохо для ASP.NET, поскольку оно будет использовать потоки, предназначенные для обработки запросов, и загрузка их слишком сильно вызовет проблемы с вашим сайтом. Когда вы используете потоки, он не использует пул потоков ASP.NET, поэтому вы можете обрабатывать столько же запросов. Но, как сказал @ ss4526, лучше всего отделить вещи, но это совсем другая история :) Просто вместо MSMQ используйте WCF :) –

1

Я исследовал эту тему совсем немного и не нашли большой ответ или технику в рамках ASP .Net, которая действительно асинхронна. Проблема, кажется, что даже если вы пнуть задачу Async, используя любой из популярных методов, перечисленных ниже:

  • QueueUserWorkItem метод
  • Async вспомогательные методы, которые начинаются с начала/конца
  • System.Thread
  • есть, вероятно, больше, что я не в курсе ...

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

Несмотря на то, что это дополнительная работа и у вас будет свой собственный набор проблем обслуживания. Я бы рекомендовал разгрузить любые длительные задачи в очередь MSMQ, а затем использовать службу Windows для обработки задач в очереди. Это позволит веб-приложению использовать все доступные потоки для обслуживания запросов, а задачи, которые вы выгрузили, будут продолжать обрабатываться в фоновом режиме. Еще одно преимущество использования MSMQ заключается в том, что вы можете отправлять задачи на совершенно другой сервер. Это имеет 2 преимущества:

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

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

+0

Спасибо за это, однако, находясь на общем сервере, я ограничен тем, что может достигаются в идеальной ситуации. Я решил начать новую тему. Поскольку основной поток (который обслуживает страницу) выходит сразу после запуска нового потока, я предполагаю, что не будет «потери» потока в пул для IIS в целом. –

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