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 interop 상황에서 COM 개체를 호출할 때 아파트를 만들고 초기화해야 합니다. 관리 스레드는 하나의 스레드만 허용하는 STA(단일 스레드 아파트)를 만들고 입력하거나 하나 이상의 스레드가 포함된 다중 스레드 아파트(MTA)를 만들 수 있습니다. 스레드의 속성을 열거형 값 중 하나로 설정 ApartmentState 하여 만든 아파트의 형식을 ApartmentState 제어할 수 있습니다. 지정된 스레드는 COM 아파트를 한 번만 초기화할 수 있으므로 관리되지 않는 코드에 대한 첫 번째 호출 후에는 아파트 유형을 변경할 수 없습니다.

자세한 내용은 관리형 및 관리되지 않는 스레딩고급 COM 상호 운용성을 참조Thread하세요.

적용 대상

추가 정보