在我的aspx頁面中,我調用了一個使用STA的COM組件。所以我使用aspcompat = true參數,但我想了解邏輯。它究竟做了什麼?據我所知,在STA中,假設只被一個線程調用。所以我應該自己提供線程安全。ASPX中的Aspcompat頁面
如果這是正確的,那麼aspcompat參數提供線程安全性?在整個頁面上,還是我訪問STA組件的地方?
在我的aspx頁面中,我調用了一個使用STA的COM組件。所以我使用aspcompat = true參數,但我想了解邏輯。它究竟做了什麼?據我所知,在STA中,假設只被一個線程調用。所以我應該自己提供線程安全。ASPX中的Aspcompat頁面
如果這是正確的,那麼aspcompat參數提供線程安全性?在整個頁面上,還是我訪問STA組件的地方?
該指令導致ASP.NET提供對ASP內部對象的訪問並將線程池更改爲MTA。
詳情籤this
這是取自報價; Pro .NET Performance
AsP.nET在默認情況下在MTA線程上執行頁面。如果你打電話給sTA 對象,他們會進行編組。如果您主要致電sTA 對象,則會降低性能。您可以通過標記 頁面與ASPCOMPAT屬性解決這個問題,具體如下:
<%@Page Language = "vb" AspCompat = "true" %>
注意頁面的構造函數仍然執行MTA線程,所以推遲 創建STA對象到的Page_Load和Page_Init事件。
當使用單線程單元(STA)COM組件,如 組件使用Visual Basic開發,從一個ASP.NET頁面,您 必須包括兼容性屬性AspCompat =真在
<%@ Page>
標籤ASP.NET頁面
上的AspCompat屬性強制頁在STA模式下執行
ASP.NET默認使用MTA(多線程單元)線程
當構建ASP.NET應用程序接口與老同學COM 對象,如那些使用VB6或Visual FoxPro(MTDLL)創建的,它是 非常重要的是提供請求的線程使用 單線程公寓線程。 STA是一種COM內置技術 ,它允許基本單線程組件在多線程環境中可靠地運行 。 STA保證在特定線程上實例化的COM對象 停留在該特定線程上,並且任何從另一個線程訪問COM對象的自動將該線程自動編組到該STA線程。最終的效果是,您可以擁有多個線程,但COM對象實例位於固定的永不改變的線程上。
ASP.NET在默認情況下使用MTA(多線程單元)線程,其中 是真正自由旋轉的線程,不考慮COM對象 編組。這比STA線程有效得多,因爲STA線程在確定是否可以在給定線程上運行 上的代碼或者是否需要某種類型的線程/ COM編組發生 有點額外開銷。 MTA COM組件可能非常有效,但多線程環境中的組件總是傾向於具有公平的開銷量。
STA在ASP.NET
支持STA在ASP.NET框架線程是相當有限的。 特別地,只有原始的ASP.NET WebForms技術支持 直接通過STA頁面處理程序實現的STA線程,或者您可能知道的ASPCOMPAT模式的 。對於運行STA部件的WebForms 是如在@Page標籤指定ASPCOMPAT屬性一樣容易:
<%@ Page Language="C#" AspCompat="true" %>
運行在STA模式的頁面。刪除它在MTA模式下運行。簡單。
STA對於非支持ASP.NET技術
唯一的WebForms支持STA本身
STA組件是一個痛苦的屁股。我覺得你的痛苦:-)
很好的參考:
你得到最終的解決方案?沒有標記的答案 – Kiquenet 2016-11-02 07:05:46