OLE及.net的線程模型

OLE 線程模型的說明和工作方式
     COM 對象可以用於一個進程的多線程。“單線程單元” (STA) 和“多線程單元” (MTA) 術語用於爲描述對象與線程間
的關係、對象間的並行關係、使用何種方 法將調用傳遞給對象的方式以及在線程間傳遞接口指針的規則而建立的概念
框架。組件及其客戶可以在 COM 目前支持的以下兩個單元模型之間進行選擇: 
1、單線程單元模型 (STA):進程中一個或多個線程使用 COM ,並且 COM 對象的調用由 COM 進行同步。在線程間對接
口進行編組。單線程單元模型的退化情況(其 中,在給定的進程中只有一個線程使用 COM)被稱爲單線程模型。以前
的 Microsoft 信息與文檔曾經將 STA 模型簡單地稱爲“單元模型”。
2、多線程單元模型 (MTA):一個或多個線程使用 COM,並且由所有與 MTA 有關的線程直接調用與 MTA 有關的 COM 對
象/,而在調用者和對象間沒有系統代碼的插入 。由於多個同步客戶可能將或多或少地同時調用對象(同時在多個處理
器系統上),所以對象必須自己同步其內部狀態。在線程間沒有接口編組。以前的  Microsoft 信息與文檔曾經將此模
型稱爲“自由線程模型”。
3、STA 模型和 MTA 模型均可以用於同一進程。 有時這種模型被稱爲“混合模型”的進程。
·
.net的線程模型
    .NET Framework 不使用單元,託管對象自己負責以線程安全的方式使用所有共享資源。
應用問題:
   如果在單元線程中調用COM組件將拋出錯誤:- 當前線程不在單線程單元中,因此無法實例化 ActiveX 控件  
   由於 COM 類使用單元,因此公共語言運行庫需要在 COM interop 的情況下調用 COM 對象時創建並初始化一個單元。託管線程可以創建並進入只允許有一個線程的單線程單元 (STA) 或者包含一個或多個線程的多線程單元 (MTA)。
   * 給定線程只能初始化 COM 單元一次,因此在第一次調用非託管代碼之後就不能更改單元類型。
設置線程模型單元類型的方法。
    1,設置線程 ApartmentState 屬性爲 ApartmentState 枚舉值。
 如:Thread.SetApartmentState(ApartmentState.STA);
    2,在CUI/GUI程序中,入口方法上指定[STAThread]/[MTAThread]特性設置單元類型
         在aspx頁面上可以使用AspCompat = "true" 來達到同樣的效果。
         這個屬性只在  Com  Interop  有用,如果全部是  managed  code  則無用。
·
附:InvalidOperationException--線程間操作無效: 從不是創建控件“...”的線程訪問它
原因:
    Windows 窗體控件本質上不是線程安全的。如果有兩個或多個線程操作某一控件的狀態,則可能會迫使該控件進入一種不一致的狀態。還可能出現其他與線程相關的 bug,包括爭用情況和死鎖。確保以線程安全方式訪問控件,.NET Framework 中控件屬性CheckForIllegalCrossThreadCalls用來設置是否線程安全方式訪問控件,如果創建某控件的線程之外的其他線程試圖調用該控件,則調試器會引發一個 InvalidOperationException,此異常在調試期間和運行時的某些情況下可靠地發生。
解決方法:
  
  1,將 CheckForIllegalCrossThreadCalls 屬性的值設置爲 false 來禁用此異常。(不建議)
  2,使用委託
   
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章