Использование ThreadPool.QueueUserWorkItem в методе WCF
Мне нужно запустить фоновую логику, которая занимает около 25-30 секунд внутри метода WCF, который не может занять более 1 секунды для завершения. Я решил обернуть эту логику в WaitCallback и передать ее в ThreadPool.QueueUserWorkItem прямо перед выходом из веб-метода. Изначально все работало нормально, но теперь у меня возникают мысли, потому что я подозреваю, что иногда метод QueueUserWorkItem не возвращается своевременно, в результате веб-метод не отвечает в течение 1 секунды на регулярной основе. Есть ли проблемы с использованием QueueUserWorkItem внутри методов WCF?
1 ответ
Нет, не как таковой, но ваш вопрос затрагивает более общую проблему: что делать с продолжительными вызовами службы? Вы также можете:
- Измените настройки так, чтобы клиент и сервер переносили длинные сервисные вызовы, т.е. увеличивали время ожидания
Или спроектируйте свои сервисные вызовы с помощью API запуска / получения текущего прогресса / получения конечного результата, и все они быстро возвращаются:
int jobID = serviceProxy.StartJob(); float progress = serviceProxy.GetJobProgress(int jobID); Result finalResult = serviceProxy.GetJobResult(int jobID);
Это больше работы, но лучший дизайн, и теперь вы также должны вести список запущенных заданий (ваше асинхронное выполнение, которое может использовать QueueUserWorkItem
или что-то еще), но все сервисные вызовы будут возвращаться быстро.