Использование задачи TPL из WCF - PullRequest
3 голосов
/ 10 февраля 2011

Чтобы оптимизировать некоторые вызовы базы данных на стороне сервера, я решил использовать System.Threading.Tasks.Task для распараллеливания нескольких вызовов базы данных, затем с помощью Task.WaitAll () получить все результаты, упаковать их и отправить клиент через WCF. Кажется, это работает нормально при тестировании на веб-сервере dev в Visual Studio (cassini), но не работает при развертывании в IIS. Профилирование клиентских вызовов (с помощью firebug) показывает, что вызовы попадают в IIS, но соответствующие вызовы не отправляются на SQL Server.

Кто-нибудь испытывал это? Есть ли ограничения в использовании задач в IIS?

1 Ответ

3 голосов
/ 10 февраля 2011

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

Чтобы увидеть, является ли это проблемой, вы можете, по крайней мере, в качестве теста, сгенерировать все свои экземпляры Task с подсказкой TaskCreationOptions.LongRunning . Это приведет к тому, что TaskScheduler по умолчанию будет создавать задачу в своем собственном, выделенном (новом) потоке вместо использования потока ThreadPool. Хотя я не думаю, что это хорошая идея для долгосрочного решения, вы сможете проверить, что это вызвало проблему с пулом потоков. Если это так, вы можете определить другие параметры, например, потенциально использовать пользовательский TaskScheduler для управления потоками / задачами для этой операции.

...