Использование ThreadPool.QueueUserWorkItem в методе WCF

Мне нужно запустить фоновую логику, которая занимает около 25-30 секунд внутри метода WCF, который не может занять более 1 секунды для завершения. Я решил обернуть эту логику в WaitCallback и передать ее в ThreadPool.QueueUserWorkItem прямо перед выходом из веб-метода. Изначально все работало нормально, но теперь у меня возникают мысли, потому что я подозреваю, что иногда метод QueueUserWorkItem не возвращается своевременно, в результате веб-метод не отвечает в течение 1 секунды на регулярной основе. Есть ли проблемы с использованием QueueUserWorkItem внутри методов WCF?

1 ответ

Нет, не как таковой, но ваш вопрос затрагивает более общую проблему: что делать с продолжительными вызовами службы? Вы также можете:

  1. Измените настройки так, чтобы клиент и сервер переносили длинные сервисные вызовы, т.е. увеличивали время ожидания
  2. Или спроектируйте свои сервисные вызовы с помощью API запуска / получения текущего прогресса / получения конечного результата, и все они быстро возвращаются:

    int jobID = serviceProxy.StartJob();
    float progress = serviceProxy.GetJobProgress(int jobID);
    Result finalResult = serviceProxy.GetJobResult(int jobID);
    

Это больше работы, но лучший дизайн, и теперь вы также должны вести список запущенных заданий (ваше асинхронное выполнение, которое может использовать QueueUserWorkItem или что-то еще), но все сервисные вызовы будут возвращаться быстро.

Другие вопросы по тегам