Сколько потоков 'STA' может сосуществовать внутри процесса? - PullRequest
7 голосов
/ 24 декабря 2010

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

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

Возможно ли иметь много STA потоков внутри процесса?

Ответы [ 4 ]

7 голосов
/ 24 декабря 2010

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

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

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

4 голосов
/ 24 декабря 2010

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

3 голосов
/ 24 декабря 2010

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

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

0 голосов
/ 08 сентября 2014

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

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

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

...