Как создать потоки на страницах ASP.NET из пула потоков CLR вместо пула ASP.NET? - PullRequest
3 голосов
/ 24 октября 2010

Если я создаю новый поток на странице ASP.NET, свойство IsThreadPoolThread имеет значение true. Первый вопрос, это из пула ASP.NET или пула CLR? Второй вопрос: если это из пула ASP.NET, то как создать поток из CLR и не использовать пул ASP.NET? Мне нужно синхронное решение для длительных запросов ( полная история ).

Ответы [ 3 ]

8 голосов
/ 06 февраля 2011

Во-первых, нет никакой разницы между пулом потоков ASP.NET и пулом потоков CLR.ASP.NET обрабатывает страницы в пуле потоков CLR, поэтому у ваших страниц ASP.NET всегда будет IsThreadPoolThread == true.

Мне интересно, как вы создаете свою тему.Вы используете конструктор System.Threading.Thread или ThreadPool.QueueUserWorkItem?Если вы используете ThreadPool.QueueUserWorkItem, то потоки, которые вы получаете, поступают из обычного пула потоков .net.

Наконец, так как размещено до , это всегда плохоИдея попытаться выполнить долго выполняемые задачи из ASP.NET.Мое общее предложение заключается в использовании фоновой службы Windows для обработки этих запросов, поскольку ASP.NET может прервать ваш фоновый поток в любой момент.Более подробно здесь, если вы должны сделать это в IIS: http://csharpfeeds.com/post/5415/Dont_use_the_ThreadPool_in_ASP.NET.aspx

4 голосов
/ 08 февраля 2011

Несмотря на то, что необходимо свести к минимуму влияние на транзакции и обеспечение непредвиденного в распределенных транзакциях, в этом примере действительно нет необходимости заново изобретать IIS только потому, что процесс долго выполняется. Весь мем "IIS может умереть в любой момент" ИМХО сильно преувеличен.

Да, вы можете вручную перезапустить IIS или пул приложений, но вы можете перезапустить любую другую службу, которая выполняет ту же работу для того же эффекта. Что касается автоматического повторного использования, IIS использует перекрывающиеся рабочие процессы и никогда не завершит принудительно завершенный поток (если не истекло время ожидания). Если бы это было так, у нас были бы серьезные проблемы с любым размещенным приложением (что мешает IIS уничтожить поток быстрого ответа через 0,001 мс после запуска)

По сути, позвольте IIS делать то, что IIS делает лучше всего, и не настаивать на операции синхронизации, вы просто потеряете поток пула, ожидая блокировки ввода-вывода, чего, я полагаю, вы пытаетесь избежать. Вы уже сделали хороший выбор, перейдя в Asynchronous Handlers (ASHX), используя реализацию IHttpAsyncHandler, чтобы создать свой собственный поток, который будет блокироваться по вашему желанию, не затрагивая веб-приложение и его пул. Как только вы инициируете поток асинхронной операции, поток asp.net вернется в свой собственный пул и будет готов начать обслуживание нового запроса. С ограничением по умолчанию в 100 потоков в пуле и с учетом того, что ваш процесс имеет низкую скорость процессора и высокую пропускную способность, я не сомневаюсь, что у вас никогда не кончатся потоки пула, прежде чем закончится пространство канала :). Для получения дополнительной информации о том, как построить асинхронный обработчик, проверьте эту ссылку (это старая статья, но действительная, тем не менее):

Использование потоков и создание асинхронных обработчиков в веб-коде на стороне сервера

2 голосов
/ 09 февраля 2011

На самом деле в ASP .NET есть различия в потоках: рабочие потоки и потоки ввода-вывода (системные потоки, которые, как я полагаю, вы называете потоком CLR).

Теперь ASP .NET использует рабочий поток при каждом запросе, если не используются пользовательские конфигурации, и эти рабочие потоки ограничены числом вашего ЦП; эта конфигурация может быть установлена ​​в IIS. Когда вы запускаете асинхронную задачу в ASP.NET с использованием, например, делегата, вы используете другой рабочий поток. Делегаты - это быстрый и грязный способ запуска чего-то асинхронного в .NET:)

Если вы хотите запустить новый поток, который НЕ использует рабочий поток, то вы должны явно запустить новый поток, например: new Thread () .... и т. Д. Теперь это идет с большим количеством управления кодом, и не следует асинхронному образцу, основанному на событиях. Однако есть один способ безопасного запуска асинхронных потоков - использование собственных асинхронных методов .NET для объектов. Вещи, которые вы обычно используете asynch для команд SQL, вызовов веб-служб и т. Д. Все они имеют метод BEGIN и END. Используя эти методы, вы никогда не будете использовать рабочий поток, а только поток ввода-вывода.

ASP .NET имеет несколько хитростей, когда дело доходит до асинхронных страниц. Есть две альтернативы:

  1. Асинхронная страница: которая позволяет циклу вашей страницы быть асинхронным. В основном это означает, что страница запрашивается асинхронно.
  2. Асинхронные задачи на странице: позволяет определить задачи, которые будут запускаться асинхронно при запуске страницы. Это похоже на потоки Asynch, просто ASP .NET многое делает для вас и более ограничено.

У меня нет всех деталей, но, пожалуйста, обратите внимание на два варианта библиотеки MSDN. Вот статья на эту тему: asynch programmin

...