Clipboard.GetImage() Clipboard獲取粘貼板內容爲null的解決辦法

將線程啓動模式設置爲 sta 單線程多線程

 

簡介併發

 

    STA:   Single-Thread   Apartment,   中文叫單線程套間。就是在COM庫初始化的時候建立一個內存結構,而後讓它和調用CoInitialize的線程相關聯。這個內存結構針對每一個線程都會有一個。支持STA的COM對象只能在建立它的線程裏被使用,其它線程若是再建立它就會失敗。   性能

    MTA:   Mutil-Thread   Apartment,中文叫多線程套間。COM庫在進程中建立一個內存結構,這個內存結構在整個進程中只能有一個,而後讓它和調用CoInitializeEx的線程相關聯。支持MTA的COM對象能夠在任意線程裏被使用。多有針對它的調用都會被封裝成爲消息。線程

    其實STA和MTA是COM規定的一套線程模型,用於保障多線程狀況下你的組件代碼的同步。好比說有一個COM對象它內部有一個靜態變量   gHello,那麼這個對象不管生成多少實例對於gHello在內存中只能有一份,那麼若是有兩個不一樣的實例在兩個線程裏面同時去讀寫它,就有可能出錯,因此就要就要有種機制進行同步保護,STA或者MTA就是這種機制。component

 

進程相對於一個小城鎮,線程至關於這個城鎮裏的居民,STA(單線程套間)至關於居民房,是私有的,MTA(多線程套間)至關於旅館,是公用的,Com對象至關於居民房或旅館裏的物品.接下去就好理解了,一個小城鎮(進程)裏能夠有不少不少的(居民)線程,這個城鎮(進程)只有一間旅館(MTA),但能夠有不少不少的居民房(STA).只有居民(線程)進入了房間(居民房或旅館,STA或MTA)之後才能使用該房間裏的物品(COM對象),居民房(STA)裏的物品(COM對象)只能供這間房子的主人(建立該STA的線程)使用,其它居民(線程)不能訪問.一樣,只有入住到旅館(MTA)裏的居民(線程,能夠有多個)才能夠訪問到旅館(MTA)裏的物品(com對象),但由於是公用的,因此要合理的分配(同步)才能不會產生混亂.對象


.NET支持兩種線程模型:STA和MTA。
STA(single threaded apartments)。apartment只是一個邏輯上的概念,它能夠包含一個或多個線程。一個AppDomain能夠包括一個或多個apartment。STA是指該apartment中只能包含一個thread。
MTA(multi threaded apartments)。指該apartment中能夠包含多個thread。
STA and MTA 之間最大的區別就是MTA 能夠在同一個apartment 中使用全部的共享資源併發執行多個線程。 而多個STA雖然能夠共享數據,可是不能併發執行線程,存在性能問題。blog

線程的建立:
當建立一個新的STA線程時,CLR會在該AppDomain中建立一個apartment和thread(從屬於該apartment)。若是是建立MTA線程,則會CLR會檢查該AppDomain是否存在一個存放MTA的apartment,若是存在僅建立該線程到該MTA中,不然就建立一個MTA和thread(從屬於該apartment)。
咱們能夠設置線程的屬性。例如 t.ApartmentState = ApartmentState.STA;進程

線程的使用區別:
咱們應該僅僅在訪問STA-based 的COM組件時才使用STA線程模式。能夠在註冊表的HKEY_CLASSES_ROOT\CLSID\{Class ID of the COM component} \InProcServer32 下查看到該COM的線程模式。若是該值是Apartment,則說明該COM只能以STA模式運行。其餘的值有Free(MTA),Both(STA+MTA),Single(只能在一個單一的線程中執行)。
其餘狀況下,咱們應該使用MTA的線程,雖然須要咱們費心線程間資源的同步問題。內存

相關文章
相關標籤/搜索