ApartmentState 열거형

정의

Thread의 아파트 상태를 지정합니다.Specifies the apartment state of a 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는 다중 스레드 아파트를 만들고 해당 아파트에 들어갑니다.The Thread will create and enter a multithreaded apartment.

STA 0

Thread는 단일 스레드 아파트를 만들고 해당 아파트에 들어갑니다.The Thread will create and enter a single-threaded apartment.

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 interop 상황에서 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. 관리 되는 스레드는 스레드를 하나만 허용 하는 STA (단일 스레드 아파트) 또는 하나 이상의 스레드가 포함 된 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 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 아파트를 한 번만 초기화할 수 있으므로 비관리 코드에 대 한 첫 번째 호출 후에는 아파트 형식을 변경할 수 없습니다.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.

적용 대상

추가 정보