1.ApartmentState
指定的单元状态 Thread。
命名空间: System.Threading
程序集: mscorlib(位于 mscorlib.dll)
| 成员名称 | 说明 | |
|---|---|---|
| MTA |
Thread 将创建并进入一个多线程的单元。 |
|
| STA |
Thread 将创建并进入一个单线程单元。 |
|
| Unknown |
ApartmentState 未设置属性。 |
.NET Framework 不使用的单元,而托管的对象是负责本身以线程安全的方式使用的所有共享的资源。
给定的线程只能一次初始化 COM 单元,因为在首次调用到非托管代码之后无法更改公寓类型。
高级 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("\n{0} caught:\n" + "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_ROOT\CLSID\{Class ID of the COM component} \InProcServer32 下查看到该COM的线程模式。如果该值是Apartment,则说明该COM只能以STA模式运行。其他的值有Free(MTA),Both(STA+MTA),Single(只能在一个单一的线程中执行)。
其他情况下,我们应该使用MTA的线程,虽然需要我们费心线程间资源的同步问题。
不是STA模式抛出异常:System.Threading.ThreadStateException:“当前线程不在单线程单元中,因此无法实例化 ActiveX 控件“
更多: