Partilhar via


Thread.TrySetApartmentState(ApartmentState) Método

Definição

Define o estado do apartment de um thread antes que ele seja iniciado.

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

Parâmetros

state
ApartmentState

O novo estado de apartment.

Retornos

Boolean

true se o estado de apartment for definido; caso contrário, false.

Exceções

Somente .NET Core e .NET 5 +: em todos os casos no macOS e no Linux.

state não é um estado de apartment válido.

O thread foi iniciado e encerrado ou a chamada não está sendo realizada do contexto do thread enquanto ele está em execução.

Exemplos

O exemplo de código a seguir demonstra os métodos GetApartmentState, SetApartmentState e TrySetApartmentState. O exemplo de código cria um thread. Antes de o thread ser iniciado, GetApartmentState exibe o ApartmentState.Unknown estado inicial e SetApartmentState altera o estado para ApartmentState.STA . O TrySetApartmentState método, em seguida, retorna false ao tentar alterar o estado para ApartmentState.MTA porque o estado de apartamento já está definido. Se a mesma operação tiver sido tentada com SetApartmentState , InvalidOperationException teria sido lançada.

Depois que o thread é iniciado, o TrySetApartmentState método é usado novamente. Desta vez, ela é lançada ThreadStateException porque o thread já foi iniciado.

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.

Comentários

Novos threads são inicializados como ApartmentState.MTA se o estado apartment não tiver sido definido antes de serem iniciados. O estado do apartamento deve ser definido antes do início de um thread.

Observação

O thread do aplicativo principal é inicializado como ApartmentState.MTA por padrão. A única maneira de definir o estado de apartamento do thread do aplicativo principal como ApartmentState.STA é aplicar o STAThreadAttribute atributo ao método de ponto de entrada.

O TrySetApartmentState método, junto com o GetApartmentState método e o SetApartmentState método, substitui a ApartmentState propriedade.

Aplica-se a