簡體   English   中英

有多少'STA'線程可以在進程內共存?

[英]How many 'STA' threads can coexist inside a process?

我需要在ASP.NET應用程序中使用多個STA線程來使用一些COM組件。

我在每個進程內的某處讀取,只能存在一個STA線程。 我編寫了一個示例項目並創建了許多線程並將其公寓狀態設置為STA ,它們使用COM對象,沒有任何異常。

是否可以在進程中包含許多STA線程?

您可以擁有的STA線程數量沒有固有的限制,但是您可能希望自己施加這樣的限制。

如果允許ASP.NET應用程序在新用戶請求到達時創建其他STA線程,而不限制它,最終線程數將導致應用程序的性能惡化,因為CPU在上下文切換上花費的時間過長。 這也使您的應用程序更容易受到拒絕服務攻擊。

您可以考慮設計是基於硬件或用戶配置文件設置STA線程數量的限制,一旦達到限制,實現一些池以重新使用現有STA線程來為新請求提供服務。

如果您的程序適用於許多STA線程,那么為什么要問它是否有效? :) .NET允許你有任意數量的STA線程,所以它必須工作。 但是,對於只有一個主線程和一個消息循環的典型本機應用程序,您所閱讀的內容可能是正確的。

除了記憶之外沒有上限。 當線程堆棧消耗了所有可用的地址空間時,32位進程通常會略微避免2000個線程。

記住規則,你不能在沒有編組的情況下調用從另一個STA在一個STA中創建的對象。 並且不要忘記所需的消息循環,STA線程必須泵送以保持編組活動並防止死鎖。 顯然應該強烈避免接近內存限制。

標准STA線程沒有實際限制,但是只有一個“特殊”STA線程用於具有消息循環的UI。 這可能是你在其他地方讀到的。 雖然大多數COM都適用於任何STA線程,但某些COM可能需要消息循環(例如用於計時器滴答),這將需要指向UI線程或消息泵送。

在這種情況下是否需要STA消息循環?

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM