C# ApartmentState 枚举,指定线程单元状态

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("\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 控件“

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值