STA
我需要在我的 ASP.NET 应用程序中使用多个线程来使用某些COM
组件。
我在每个进程的某个地方读到,只能STA
存在一个线程。我编写了一个示例项目并创建了许多线程并将它们的单元状态设置为STA
,并且它们COM
毫无例外地使用对象。
一个进程中可以有很多STA
线程吗?
STA
我需要在我的 ASP.NET 应用程序中使用多个线程来使用某些COM
组件。
我在每个进程的某个地方读到,只能STA
存在一个线程。我编写了一个示例项目并创建了许多线程并将它们的单元状态设置为STA
,并且它们COM
毫无例外地使用对象。
一个进程中可以有很多STA
线程吗?
您可以拥有的 STA 线程数没有固有限制,但是您可能希望自己施加这样的限制。
如果您允许您的 ASP.NET 应用程序在新用户请求到达时创建额外的 STA 线程,而不限制它,最终线程数将导致您的应用程序的性能下降,因为 CPU 在上下文切换上花费的时间变得太高. 这也使您的应用程序更容易受到拒绝服务攻击。
您可以考虑一种设计,即根据您的硬件或用户配置文件设置 STA 线程数的限制,一旦达到限制,实施一些池以重用现有 STA 线程来服务新请求。
如果您的程序与许多 STA 线程一起工作,那么您为什么要问它是否工作?:) .NET 允许您拥有任意数量的 STA 线程,因此它必须工作。不过,对于只有一个主线程和一个消息循环的典型本机应用程序,您所阅读的内容可能是正确的。
除了内存,没有上限。当线程堆栈耗尽所有可用地址空间时,一个 32 位进程通常会减少 2000 个线程。
请记住这些规则,您不能在没有编组的情况下从另一个 STA 调用在一个 STA 中创建的对象。并且不要忘记所需的消息循环,STA 线程必须泵送以保持编组活动并防止死锁。显然,应强烈避免接近内存限制。
标准 STA 线程没有真正的限制,但对于具有消息循环的 UI,只有一个“特殊”STA 线程。这可能是你在别处读到的。虽然大多数 COM 都适用于任何 STA 线程,但某些 COM 可能需要消息循环(例如用于计时器计时),这将需要指向 UI 线程或消息泵送。
http://blogs.msdn.com/b/cbrumme/archive/2004/02/02/66219.aspx