2011-03-06 116 views
3

在我的aspx頁面中,我調用了一個使用STA的COM組件。所以我使用aspcompat = true參數,但我想了解邏輯。它究竟做了什麼?據我所知,在STA中,假設只被一個線程調用。所以我應該自己提供線程安全。ASPX中的Aspcompat頁面

如果這是正確的,那麼aspcompat參數提供線程安全性?在整個頁面上,還是我訪問STA組件的地方?

+0

你得到最終的解決方案?沒有標記的答案 – Kiquenet 2016-11-02 07:05:46

回答

1

該指令導致ASP.NET提供對ASP內部對象的訪問並將線程池更改爲MTA。

詳情籤this

1

這是取自報價; Pro .NET Performance

AsP.nET在默認情況下在MTA線程上執行頁面。如果你打電話給sTA 對象,他們會進行編組。如果您主要致電sTA 對象,則會降低性能。您可以通過標記 頁面與ASPCOMPAT屬性解決這個問題,具體如下:

<%@Page Language = "vb" AspCompat = "true" %> 

注意頁面的構造函數仍然執行MTA線程,所以推遲 創建STA對象到的Page_Load和Page_Init事件。

1

當使用單線程單元(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本身

  • ASP.NET HttpHandlers的
  • ASMX Web服務
  • ASP。 NET MVC
  • WCF Web服務
  • 的ASP.NET Web API

STA組件是一個痛苦的屁股。我覺得你的痛苦:-)

很好的參考:

https://weblog.west-wind.com/posts/2012/Sep/18/Creating-STA-COM-compatible-ASPNET-Applications#STAfornonsupportingASP.NETTechnologies