ApartmentState ApartmentState ApartmentState ApartmentState Enum

定義

Thread のアパートメント状態を指定します。Specifies the apartment state of a Thread.

public enum class ApartmentState
[System.Runtime.InteropServices.ComVisible(true)]
[System.Serializable]
public enum ApartmentState
type ApartmentState = 
Public Enum ApartmentState
継承
ApartmentStateApartmentStateApartmentStateApartmentState
属性

フィールド

MTA MTA MTA MTA 1

Thread は、マルチスレッド アパートメントを作成および入力します。The Thread will create and enter a multithreaded apartment.

STA STA STA STA 0

Thread は、シングルスレッド アパートメントを作成および入力します。The Thread will create and enter a single-threaded apartment.

Unknown Unknown Unknown Unknown 2

ApartmentState プロパティが設定されていません。The ApartmentState property has not been set.

次のコード例では、スレッドのアパートメント状態を設定する方法を示します。The following code example demonstrates how to set the apartment state of a thread.

using namespace System;
using namespace System::Threading;
ref class ApartmentTest
{
public:
   static void ThreadMethod()
   {
      Thread::Sleep( 1000 );
   }

};

int main()
{
   Thread^ newThread = gcnew Thread( gcnew ThreadStart( &ApartmentTest::ThreadMethod ) );
   newThread->SetApartmentState(ApartmentState::MTA);
   
   Console::WriteLine( "ThreadState: {0}, ApartmentState: {1}", newThread->ThreadState.ToString(), newThread->GetApartmentState().ToString() );
   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.ToString(), newThread->GetApartmentState().ToString() );
   }

}

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);
    }
}
Imports System.Threading

Public Class ApartmentTest

    <MTAThread> _
    Shared Sub Main()
    
        Dim newThread As Thread = New Thread(AddressOf ThreadMethod)
        newThread.SetApartmentState(ApartmentState.MTA)

        Console.WriteLine("ThreadState: {0}, ApartmentState: {1}", _
            newThread.ThreadState, newThread.GetApartmentState())

        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 stateException As ThreadStateException
            Console.WriteLine(vbCrLf & "{0} caught:" & vbCrLf & _
                "Thread is not In the Unstarted or Running state.", _
                stateException.GetType().Name)
            Console.WriteLine("ThreadState: {0}, ApartmentState: " & _
                "{1}", newThread.ThreadState, newThread.GetApartmentState())
        End Try

    End Sub

    Shared Sub ThreadMethod()
        Thread.Sleep(1000)
    End Sub

End Class

注釈

アパートメントとは、同じスレッドへのアクセス要件を共有するオブジェクトのプロセス内での論理コンテナーです。An apartment is a logical container within a process for objects sharing the same thread access requirements. 同じアパートメント内のすべてのオブジェクトは、任意のスレッド アパートメント内からの呼び出しを受信できます。All objects in the same apartment can receive calls from any thread in the apartment. .NET Framework では、アパートメントを使用しませんが、マネージ オブジェクトが自体のスレッド セーフ方式ですべての共有リソースを使用する責任を負います。The .NET Framework does not use apartments, and managed objects are responsible for using all shared resources in a thread-safe manner themselves.

COM クラスでは、アパートメントを使用するため、共通言語ランタイムを作成し、COM 相互運用機能の状況では、COM オブジェクトを呼び出すときに、アパートメントを初期化する必要があります。Because COM classes use apartments, the common language runtime needs to create and initialize an apartment when calling a COM object in a COM interop situation. マネージ スレッドは、作成し、1 つのスレッドをシングル スレッド アパートメント (STA) または 1 つまたは複数のスレッドを含むマルチ スレッド アパートメント (MTA) を入力します。A managed thread can create and enter a single-threaded apartment (STA) that allows only one thread, or a multithreaded apartment (MTA) that contains one or more threads. 設定によって作成されたアパートメントの種類を制御することができます、ApartmentStateの値の 1 つのスレッドのプロパティ、ApartmentState列挙体。You can control the type of apartment created by setting the ApartmentState property of the thread to one of the values of the ApartmentState enumeration. 特定のスレッドは、COM アパートメントを 1 回初期化することができますのみ、ため、アンマネージ コードの最初の呼び出し後にアパートメントの種類を変更できません。Because a given thread can only initialize a COM apartment once, you cannot change the apartment type after the first call to the unmanaged code.

詳細については、次を参照してください。 Threadマネージとアンマネージ スレッド、および高度な COM 相互運用性します。For more information, see Thread, Managed and Unmanaged Threading, and Advanced COM Interoperability.

適用対象

こちらもご覧ください