Сколько потоков 'STA' может сосуществовать внутри процесса?

Мне нужно несколько STA потоки внутри моего приложения ASP.NET, чтобы использовать некоторые COM компоненты.

Я читаю где-то внутри каждого процесса, только один STA нить может существовать. Я кодировал пример проекта, сделал много потоков и установил их состояние квартиры STA и они работают с COM объекты без каких-либо исключений.

Можно ли иметь много STA темы внутри процесса?

4 ответа

Решение

Если ваша программа работает со многими потоками STA, то почему вы спрашиваете, работает ли она?:) .NET позволяет иметь любое количество потоков STA, поэтому оно должно работать. Однако то, что вы читаете, может быть правдой для типичных нативных приложений с одним главным потоком и циклом сообщений.

Не существует собственного ограничения на количество потоков STA, которое вы можете иметь, однако вы, вероятно, захотите установить такое ограничение самостоятельно.

Если вы позволите приложению ASP.NET создавать дополнительные потоки STA по мере поступления новых пользовательских запросов, не ограничивая его, в конечном итоге количество потоков приведет к снижению производительности вашего приложения, поскольку количество времени, затрачиваемое ЦП на переключение контекста, становится слишком высоким., Это также делает ваше приложение намного более уязвимым для атак отказа в обслуживании.

Вы можете рассмотреть проект, в котором вы установили ограничение на количество потоков STA на основе вашего аппаратного обеспечения или профиля пользователя, и после того, как ограничение будет достигнуто, внедрите некоторый пул для повторного использования существующих потоков STA для обслуживания новых запросов.

Там нет верхнего предела, кроме памяти. 32-битный процесс обычно несколько стесняется из 2000 потоков, когда стеки потоков занимают все доступное адресное пространство.

Помните правила, вы не можете вызывать объект, который был создан в одной STA из другой STA без маршалинга. И не забывайте про обязательную петлю сообщений, поток STA должен качать, чтобы поддерживать маршалинг живым и предотвращать тупик. Очевидно, что следует избегать попадания в область, близкую к пределу памяти.

Нет никакого реального ограничения на стандартный поток STA, но есть только один "специальный" поток STA для пользовательского интерфейса, который имеет цикл сообщений. Это может быть то, что вы читали в другом месте. В то время как большинство COM подходит для любого потока STA, для некоторых COM может потребоваться цикл обработки сообщений (например, для отметки времени), который потребует обращения к потоку пользовательского интерфейса или перекачки сообщений.

Требуется ли в этом случае петля сообщений STA?

http://blogs.msdn.com/b/cbrumme/archive/2004/02/02/66219.aspx

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