Thread.SetApartmentState(ApartmentState) Método
Definição
Importante
Algumas informações dizem respeito a um produto pré-lançado que pode ser substancialmente modificado antes de ser lançado. A Microsoft não faz garantias, de forma expressa ou implícita, em relação à informação aqui apresentada.
Define o estado do apartamento de um tópico antes de ser iniciado.
public:
void SetApartmentState(System::Threading::ApartmentState state);
public void SetApartmentState(System.Threading.ApartmentState state);
member this.SetApartmentState : System.Threading.ApartmentState -> unit
Public Sub SetApartmentState (state As ApartmentState)
Parâmetros
- state
- ApartmentState
O novo estado do apartamento.
Exceções
.NET Core e .NET 5+ apenas: Em todos os casos no macOS e Linux.
state não é um estado válido para apartamentos.
O tópico já foi iniciado.
O estado do apartamento já foi iniciado.
Exemplos
O exemplo de código seguinte demonstra os GetApartmentStatemétodos , SetApartmentState, e TrySetApartmentState . O exemplo de código cria um thread. Antes de iniciar o thread, GetApartmentState apresenta o estado inicial ApartmentState.Unknown e SetApartmentState altera o estado para ApartmentState.STA. O TrySetApartmentState método depois regressa false ao tentar mudar o estado para ApartmentState.MTA porque o estado do apartamento já está definido. Se a mesma operação tivesse sido tentada com SetApartmentState, InvalidOperationException teria sido cancelada.
Depois de iniciada a thread, o TrySetApartmentState método é usado novamente. Desta vez, ele lança ThreadStateException porque o tópico já foi iniciado.
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.
*/
open System.Threading
let threadProc () = Thread.Sleep 2000
let t = Thread threadProc
printfn $"Before setting apartment state: {t.GetApartmentState()}"
t.SetApartmentState ApartmentState.STA
printfn $"After setting apartment state: {t.GetApartmentState()}"
let result = t.TrySetApartmentState ApartmentState.MTA
printfn $"Try to change state: {result}"
t.Start()
Thread.Sleep 500
try
t.TrySetApartmentState ApartmentState.STA |> ignore
with :? ThreadStateException ->
printfn "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.
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.
Observações
As novas threads são inicializadas como ApartmentState.MTA se o estado do apartamento não tivesse sido definido antes de serem iniciadas. O estado do apartamento tem de ser definido antes de iniciar um tópico.
Note
A thread principal da aplicação é inicializada por ApartmentState.MTA defeito. A única forma de definir o estado do apartamento da thread ApartmentState.STA principal da aplicação é aplicar o STAThreadAttribute atributo ao método do ponto de entrada.
O SetApartmentState método, juntamente com o GetApartmentState método e o TrySetApartmentState método, substitui a ApartmentState propriedade.