У нас есть несколько длительных бизнес-процессов, которые инициируются через службы WCF, работающие в IIS (интегрированный режим) на WS 2008 R2.Эти бизнес-процессы обычно включают в себя много взаимодействия с нашим сервером SQL Server.Мы создали специальную реализацию очереди задач, в которой запросы помещаются в очередь посредством первоначального вызова службы, а затем выполняются на основе приоритета.Это выполнение может занять много времени (20-30 минут).Затем клиенты могут запросить сервер о ходе выполнения своих собственных фоновых задач.
В нашей текущей реализации задачи запускаются в отдельном потоке для выполнения, а не из ThreadPool.Это было сделано из-за чтения рекомендаций о том, что не выполняются долго выполняющиеся задачи с использованием ThreadPool, чтобы предотвратить голодание запросов ASP.NET.Мы контролируем количество порождаемых потоков, устанавливая верхний предел на количество фоновых задач, которые могут выполняться одновременно.Таким образом, мы пытаемся контролировать нагрузку на процессор и предотвращать слишком большое переключение контекста потока.Хотя все это происходит, нам, конечно, все еще нужно обслуживать обычные «онлайновые» запросы на приложение.
После прочтения этого поста Томасом Марквардтом я обеспокоено том, что мы не используем ThreadPool, поскольку мы не получим преимущества встроенной в него эвристики настройки.Мы уже решаем проблему завершения работы, о которой Томас упоминает, подключившись к событию ApplicationEnd и отменив долго выполняющиеся задачи.Итак, мой вопрос, должны ли мы перейти на использование ThreadPool?Как насчет того, чтобы эти нити были связаны в течение длительных периодов времени?Если я правильно понимаю Томаса, он говорит, что это не имеет значения, так как ThreadPool настроится на создание большего количества запросов для обслуживания обычных онлайн-операций?Я также прочитал этот вопрос StackOverflow , который охватывает те же вопросы, но я все еще не уверен относительно дальнейших действий.