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 控件“

 

更多:

C# 線程同步之排它鎖/Monitor監視器類

C# lock關鍵詞/lock語句塊、線程鎖

C#使用Process類調用外部程序(轉)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM