Особые замечания по использованию потоков в IIS - PullRequest
3 голосов
/ 30 августа 2011

Я бы хотел начать использовать асинхронную обработку в IIS.Редактировать: я говорю об использовании параллельной библиотеки задач.

Например, при определенных загрузках страницы я хочу записать кучу дерьма, отправить электронное письмо, обновить некоторые таблицы и т. Д. Но я нехочу, чтобы пользователь ждал, пока я запишу всю эту хрень.

Так что обычно я делаю, что у меня есть статическая очередь, в которую я помещаю информацию журнала, и затем у меня есть задание cron, которое каждые 10 минут вызывает специальную страницу, чья OnLoad сбрасывает очередь.Это работает, но это довольно неудобно в настройке, особенно если вы хотите записать 50 вещей.Я бы предпочел сделать это:

Task.CreateNew(() => Log(theStuff));

Тем не менее, я боюсь выполнения задач в IIS, потому что один сбой и весь ваш сайт выходит из строя.

Так что теперь у меня есть

SafeTask.FireAndForget(() => Log(theStuff));

Это оборачивает делегата в некоторый try / catch и передает его в Task.CreateNew.Поэтому, если кто-то изменяет что-то, что влияет на что-то другое, что генерирует исключение в другом месте, которое случайно генерируется в потоке задач, мы получаем уведомление вместо сбойного веб-сайта.Кроме того, уведомление об ошибке внутри catch также находится внутри собственного try / catch, и catch для этого также имеет try / catch, который пытается войти другим способом.

Теперь, когда я могу безопасно запускать вещиАсинхронно в IIS, о каких других вещах мне нужно беспокоиться, прежде чем я смогу начать использовать свой класс SafeTask?

Ответы [ 2 ]

1 голос
/ 30 августа 2011

Каждый запрос в IIS и .net по умолчанию обрабатывается в одном потоке. Этот поток происходит из пула потоков, называемого «пул приложений». Существующие потоки используются повторно, поэтому вы не сможете использовать их для состояния потока, пока не очистите или не установите его каждый раз. Вы определяете размер этого пула потоков, используя формулу из MSDN в machine.config или даже в своем web.config.

Теперь каждый вызов асинхронной функции помещается в другой поток. Это включает в себя вызовы асинхронных веб-служб, функции асинхронных страниц, асинхронные делегаты и т. Д. Этот поток происходит из «пула приложений», тем самым уменьшая количество потоков, доступных для IIS для обслуживания новых запросов.

Скорее всего, ваше приложение будет работать нормально при использовании вызовов асинхронных функций. Если вы беспокоитесь или у вас много асинхронных задач, вы можете создать свой собственный пул потоков или посмотреть на SmartThreadPool на codeplex.

Надеюсь, это поможет.

1 голос
/ 30 августа 2011

Рассмотрите возможность использования события OnUnload страницы.Прочтите об этом здесь: http://msdn.microsoft.com/en-us/library/ms178472.aspx

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

В зависимости от вашего вопроса, вы должны быть обеспокоены исчерпанием пула потоков только в том случае, если тестирование нагрузки и производительности показывает, что вы работаете с ограничениями потоков.Если нет, то то, что вы предлагаете, безусловно разумно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...