次の方法で共有


ApartmentState 列挙型

定義

Thread のアパートメント状態を指定します。

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

フィールド

MTA 1

Thread は、マルチスレッド アパートメントを作成および入力します。

STA 0

Thread は、シングルスレッド アパートメントを作成および入力します。

Unknown 2

ApartmentState プロパティが設定されていません。

次のコード例は、スレッドのアパートメント状態を設定する方法を示しています。

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.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(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

注釈

アパートメントは、同じスレッド アクセス要件を共有するオブジェクトのプロセス内の論理コンテナーです。 同じアパートメント内のすべてのオブジェクトは、アパートメント内の任意のスレッドから呼び出しを受け取ることができます。 .NET Frameworkではアパートメントは使用されず、マネージド オブジェクトはスレッド セーフな方法ですべての共有リソースを使用する必要があります。

COM クラスはアパートメントを使用するため、共通言語ランタイムは、COM 相互運用状況で COM オブジェクトを呼び出すときにアパートメントを作成して初期化する必要があります。 マネージド スレッドは、1 つのスレッドのみを許可するシングル スレッド アパートメント (STA) または 1 つ以上のスレッドを含むマルチスレッド アパートメント (MTA) を作成して入力できます。 スレッドのプロパティを列挙の値の 1 つに設定 ApartmentState することで、作成されたアパートメントの種類を ApartmentState 制御できます。 特定のスレッドは COM アパートメントを 1 回だけ初期化できるため、アンマネージ コードの最初の呼び出し後にアパートメントの種類を変更することはできません。

詳細については、「Threadマネージド スレッドとアンマネージド スレッド」および「高度な COM 相互運用性」を参照してください。

適用対象

こちらもご覧ください