Thread.TrySetApartmentState(ApartmentState) Metodo
Definizione
Importante
Alcune informazioni sono relative alla release non definitiva del prodotto, che potrebbe subire modifiche significative prima della release definitiva. Microsoft non riconosce alcuna garanzia, espressa o implicita, in merito alle informazioni qui fornite.
Imposta lo stato apartment di un thread prima dell'avvio.
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
Parametri
- state
- ApartmentState
Nuovo stato dell'appartamento.
Restituisce
true se lo stato dell'appartamento è impostato; in caso contrario, false.
Eccezioni
Solo .NET Core e .NET 5+: in tutti i casi in macOS e Linux.
state non è uno stato di appartamento valido.
Il thread è stato avviato e ha terminato oppure la chiamata non viene eseguita dal contesto del thread mentre il thread è in esecuzione.
Esempio
Nell'esempio di codice seguente vengono illustrati i GetApartmentStatemetodi , SetApartmentStatee TrySetApartmentState . L'esempio di codice crea un thread. Prima dell'avvio del thread, GetApartmentState visualizza lo stato iniziale ApartmentState.Unknown e SetApartmentState modifica lo stato in ApartmentState.STA. Il TrySetApartmentState metodo restituisce false quindi quando si tenta di modificare lo stato in ApartmentState.MTA perché lo stato dell'apartment è già impostato. Se la stessa operazione fosse stata tentata con SetApartmentState, InvalidOperationException sarebbe stata generata.
Dopo l'avvio del thread, il TrySetApartmentState metodo viene nuovamente usato. Questa volta viene generata ThreadStateException perché il thread è già stato avviato.
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.
Commenti
I nuovi thread vengono inizializzati come ApartmentState.MTA se lo stato apartment non sia stato impostato prima dell'avvio. Lo stato dell'apartment deve essere impostato prima dell'avvio di un thread.
Annotazioni
Il thread dell'applicazione principale viene inizializzato in per ApartmentState.MTA impostazione predefinita. L'unico modo per impostare lo stato apartment del thread applicazione principale su ApartmentState.STA consiste nell'applicare l'attributo STAThreadAttribute al metodo del punto di ingresso.
Il TrySetApartmentState metodo, insieme al GetApartmentState metodo e al SetApartmentState metodo , sostituisce la ApartmentState proprietà .