ThreadPool.QueueUserWorkItem в веб-службе для задачи "Огонь и забудь"
Это веб-служба ASP.NET ASMX / .NET Framework 4.0.
В веб-сервисе я хочу выполнить один метод в другом потоке, что-то вроде "Fire and Forget", чтобы веб-сервис немедленно возвращал какое-то значение в ответ на веб-сайт. Этот метод в другом потоке может занять 10 минут после того, как веб-служба немедленно вернет ответ на веб-сайт. Кроме того, мне не нужно возвращать значение этого метода.
Я протестировал этот сценарий с использованием ThreadPool.QueueUserWorkItem, и кажется, что поток, запущенный с использованием ThreadPool, будет продолжать выполняться даже после того, как веб-служба вернет ответ на веб-сайт. Я прав здесь? И есть ли лучший способ добиться этого?
1 ответ
Проблема в том, что время от времени ASP.NET перезапускает пул приложений. Поскольку он не знает о вашей фоновой задаче, он не будет рассматриваться и будет прерван при удалении домена приложения.
Большую часть времени работа будет завершена, но если вы будете работать достаточно долго, вы столкнетесь с этим сценарием.
Есть два решения:
1) "Правильный" способ - написать службу Windows, которая работает за пределами ASP.NET. Вы можете отправить инструкции в Службу через WCF.
2) "Быстрый и грязный" способ - создать на вашем сайте ASP.NET скрытый веб-сервис, который никогда не вызывается пользователями. Ваше приложение запускает асинхронный запрос к скрытой службе, а затем возвращает свой собственный результат пользователю, не дожидаясь.
ASP.NET не знает, что запрос к скрытому сервису пришел из вашего приложения - он просто обрабатывает его как еще один запрос. Поскольку ASP.NET знает об этом запросе, он не прервет его при повторном выполнении.