zoukankan      html  css  js  c++  java
  • 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("
    {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 控件“

    更多:

    C# 线程同步之排它锁/Monitor监视器类

    C# lock关键词/lock语句块、线程锁

    C#使用Process类调用外部程序(转)

  • 相关阅读:
    Qt Q3DScatter中元素的移动和旋转
    Qt QtDataVisualization Q3DScatter绘制散点图
    Qt qwtplot3d根据时间采集多条曲线
    Qt QWT3D 之 三维动态曲线的实现
    Qt 数据可视化之3D图形
    Vagrant在虚拟机Centos7上安装Docker
    VirtualBox+Vagrant环境搭建
    VMware安装Centos7超详细过程(图文)
    上传excel表格批量导入数据到数据库
    IP协议包头分析
  • 原文地址:https://www.cnblogs.com/tianma3798/p/6576150.html
Copyright © 2011-2022 走看看