다음을 통해 공유


Thread.TrySetApartmentState(ApartmentState) 메서드

정의

스레드를 시작하기 전에 스레드의 아파트 상태를 설정합니다.

public:
 bool TrySetApartmentState(System::Threading::ApartmentState state);
public bool TrySetApartmentState (System.Threading.ApartmentState state);
member this.TrySetApartmentState : System.Threading.ApartmentState -> bool
Public Function TrySetApartmentState (state As ApartmentState) As Boolean

매개 변수

state
ApartmentState

새 아파트 상태입니다.

반환

Boolean

아파트 상태가 설정되어 있으면 true이고, 그렇지 않으면 false입니다.

예외

.NET Core 및 .NET 5 +만 해당: macOS 및 Linux의 모든 경우에 해당 합니다.

state가 잘못된 아파트 상태가 아닙니다.

스레드가 시작되어 종료되었거나 스레드가 실행 중인 동안 스레드의 컨덱스트에서 호출이 수행되지 않습니다.

예제

다음 코드 예제에서는 GetApartmentState , 및 메서드를 보여 줍니다 SetApartmentState TrySetApartmentState . 코드 예제는 스레드를 만듭니다. 스레드가 시작 되기 전에는 GetApartmentState 초기 상태를 표시 하 ApartmentState.UnknownSetApartmentState 상태를로 변경 ApartmentState.STA 합니다. TrySetApartmentState false ApartmentState.MTA 아파트 상태가 이미 설정 되었기 때문에 메서드는 상태를로 변경 하려고 할 때를 반환 합니다. 로 동일한 작업을 시도한 경우 SetApartmentState 이 throw 됩니다 InvalidOperationException .

스레드가 시작 된 후에는 TrySetApartmentState 메서드가 다시 사용 됩니다. ThreadStateException스레드가 이미 시작 되었기 때문에이 시간이 throw 됩니다.

using namespace System;
using namespace System::Threading;

void ThreadProc()
{
    Thread::Sleep(2000);
};

void main()
{
    Thread^ t = gcnew Thread(gcnew ThreadStart(ThreadProc));
    Console::WriteLine("Before setting apartment state: {0}", 
            t->GetApartmentState());

    t->SetApartmentState(ApartmentState::STA);
    Console::WriteLine("After setting apartment state: {0}", 
        t->GetApartmentState());

    bool result = t->TrySetApartmentState(ApartmentState::MTA);
    Console::WriteLine("Try to change state: {0}", result);

    t->Start();

    Thread::Sleep(500);

    try
    {
        t->TrySetApartmentState(ApartmentState::STA);
    }
    catch (ThreadStateException^)
    {
        Console::WriteLine("ThreadStateException occurs " +
            "if apartment state is set after starting thread.");
    }

    t->Join();
}

/* This code example produces the following output:

Before setting apartment state: Unknown
After setting apartment state: STA
Try to change state: False
ThreadStateException occurs if apartment state is set after starting thread.
 */
using System;
using System.Threading;

class Example
{
    public static void Main()
    {
        Thread t = new Thread(ThreadProc);
        Console.WriteLine("Before setting apartment state: {0}",
            t.GetApartmentState());

        t.SetApartmentState(ApartmentState.STA);
        Console.WriteLine("After setting apartment state: {0}",
            t.GetApartmentState());

        bool result = t.TrySetApartmentState(ApartmentState.MTA);
        Console.WriteLine("Try to change state: {0}", result);

        t.Start();

        Thread.Sleep(500);

        try
        {
            t.TrySetApartmentState(ApartmentState.STA);
        }
        catch (ThreadStateException)
        {
            Console.WriteLine("ThreadStateException occurs " +
                "if apartment state is set after starting thread.");
        }

        t.Join();
    }

    public static void ThreadProc()
    {
        Thread.Sleep(2000);
    }
}

/* This code example produces the following output:

Before setting apartment state: Unknown
After setting apartment state: STA
Try to change state: False
ThreadStateException occurs if apartment state is set after starting thread.
 */
Imports System.Threading

Module Example

    Sub Main()
 
        Dim t As New Thread(AddressOf ThreadProc)
        Console.WriteLine("Before setting apartment state: {0}", _
            t.GetApartmentState())

        t.SetApartmentState(ApartmentState.STA)
        Console.WriteLine("After setting apartment state: {0}", _
            t.GetApartmentState())

        Dim result As Boolean = _
            t.TrySetApartmentState(ApartmentState.MTA)
        Console.WriteLine("Try to change state: {0}", result)

        t.Start()

        Thread.Sleep(500)

        Try
            t.TrySetApartmentState(ApartmentState.STA)
        Catch ex As ThreadStateException
            Console.WriteLine("ThreadStateException occurs " & _
                "if apartment state is set after starting thread.")
        End Try

        t.Join()
    End Sub

    Sub ThreadProc()
        Thread.Sleep(2000)
    End Sub
End Module

' This code example produces the following output:
'
'Before setting apartment state: Unknown
'After setting apartment state: STA
'Try to change state: False
'ThreadStateException occurs if apartment state is set after starting thread.

설명

새 스레드는 ApartmentState.MTA 해당 아파트 상태가 시작 되기 전에 설정 되지 않은 것 처럼 초기화 됩니다. 스레드를 시작 하기 전에 아파트 상태를 설정 해야 합니다.

참고

기본 애플리케이션 스레드가 초기화가 ApartmentState.MTA 기본적으로 합니다. 주 애플리케이션 스레드의 아파트 상태를 설정 하는 유일한 방법은 ApartmentState.STA 적용 하는 것은 STAThreadAttribute 진입점 메서드 특성입니다.

메서드와 메서드와 함께 메서드는 TrySetApartmentState GetApartmentState 속성을 SetApartmentState 대체 ApartmentState 합니다.

적용 대상