有多少'STA'线程可以在进程内共存?

时间:2010-12-24 18:22:01

标签: c# multithreading sta apartment-state

我需要在ASP.NET应用程序中使用多个STA个线程来使用一些COM组件。

我在每个进程中的某处读取,只能存在一个STA线程。我编写了一个示例项目并创建了许多线程并将其公寓状态设置为STA,并且它们与COM个对象一起使用,没有任何例外。

流程中是否可以有多个STA个线程?

4 个答案:

答案 0 :(得分:7)

您可以拥有的STA线程数没有固有的限制,但是您可能希望自己施加这样的限制。

如果允许ASP.NET应用程序在新用户请求到达时创建其他STA线程,而不限制它,最终线程数将导致应用程序的性能随着CPU在上下文切换上花费的时间而恶化变得太高了。这也使您的应用程序更容易受到拒绝服务攻击。

您可以考虑设计是否根据您的硬件或用户配置文件设置了STA线程数量的限制,一旦达到限制,请实施一些池以重新使用现有STA线程来为新请求提供服务。 / p>

答案 1 :(得分:4)

如果您的程序适用于多个STA线程,那么为什么要问它是否有效? :) .NET允许你有任意数量的STA线程,所以它必须工作。但是,对于只有一个主线程和一个消息循环的典型本机应用程序,您所阅读的内容可能是正确的。

答案 2 :(得分:3)

除了记忆之外没有上限。当线程堆栈消耗了所有可用的地址空间时,32位进程通常会略微避免2000个线程。

记住规则,不能在没有编组的情况下调用从另一个STA在一个STA中创建的对象。并且不要忘记所需的消息循环,STA线程必须泵送以保持编组活动并防止死锁。显然应该强烈避免接近内存限制。

答案 3 :(得分:0)

标准STA线程没有实际限制,但是只有一个“特殊”STA线程用于具有消息循环的UI。这可能是你在其他地方读到的。虽然大多数COM都适用于任何STA线程,但某些COM可能需要消息循环(例如计时器滴答),这将需要指向UI线程或消息泵送。

Is STA Message Loop Required in This Case?

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