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的线程,虽然须要咱们费心线程间资源的同步问题。内存

相关文章
相关标签/搜索