1.ApartmentState
指定的单元状态 Thread。
命名空间: System.Threading
程序集: mscorlib(位于 mscorlib.dll)
成员名称 | 说明 | |
---|---|---|
MTA |
Thread 将创建并进入一个多线程的单元。 |
|
STA |
Thread 将创建并进入一个单线程单元。 |
|
Unknown |
ApartmentState 未设置属性。 |
单元是进程内部的对象共享相同的线程访问要求的逻辑容器。 在同一单元中的所有对象可以都接收来自与单元中的任何线程的调用。 .NET Framework 不使用的单元,而托管的对象是负责本身以线程安全的方式使用的所有共享的资源。
由于 COM 类使用的单元,公共语言运行时将需要创建并初始化一个单元,在 COM 互操作的情况下调用 COM 对象时。 托管的线程可以创建并输入只允许一个线程,单线程单元 (STA) 或包含一个或多个线程的多线程的单元 (MTA)。 您可以控制通过设置创建的单元类型ApartmentState 属性的值之一的线程 ApartmentState 枚举。 给定的线程只能一次初始化 COM 单元,因为在首次调用到非托管代码之后无法更改公寓类型。
有关详细信息,请参阅 Thread, ,托管和非托管线程处理, ,和 高级 COM 互操作性。
使用实例:
using System; using System.Threading; class ApartmentTest { static void Main() { Thread newThread = new Thread(new ThreadStart(ThreadMethod)); newThread.SetApartmentState(ApartmentState.MTA); Console.WriteLine("ThreadState: {0}, ApartmentState: {1}", newThread.ThreadState, newThread.ApartmentState); newThread.Start(); // Wait for newThread to start and go to sleep. Thread.Sleep(300); try { // This causes an exception since newThread is sleeping. newThread.SetApartmentState(ApartmentState.STA); } catch(ThreadStateException stateException) { Console.WriteLine(" {0} caught: " + "Thread is not in the Unstarted or Running state.", stateException.GetType().Name); Console.WriteLine("ThreadState: {0}, ApartmentState: {1}", newThread.ThreadState, newThread.GetApartmentState()); } } static void ThreadMethod() { Thread.Sleep(1000); } }
如何使用:
线程的使用区别:
我们应该仅仅在访问STA-based 的COM组件时才使用STA线程模式。可以在注册表的HKEY_CLASSES_ROOTCLSID{Class ID of the COM component} InProcServer32 下查看到该COM的线程模式。如果该值是Apartment,则说明该COM只能以STA模式运行。其他的值有Free(MTA),Both(STA+MTA),Single(只能在一个单一的线程中执行)。
其他情况下,我们应该使用MTA的线程,虽然需要我们费心线程间资源的同步问题。
不是STA模式抛出异常:System.Threading.ThreadStateException:“当前线程不在单线程单元中,因此无法实例化 ActiveX 控件“
更多: