Thread.TrySetApartmentState(ApartmentState) Metódus

Definíció

Beállítja egy szál lakásállapotát a kezdés előtt.

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

Paraméterek

state
ApartmentState

Az új lakás állapota.

Válaszok

trueha a lakás állapota be van állítva; egyéb esetben. false

Kivételek

.NET Core és .NET 5+: Minden esetben macOS és Linux rendszeren.

state nem érvényes lakás állapota.

A szál elindult és leállt, vagy a hívás nem a szál környezetéből lett elindítva, miközben a szál fut.

Példák

Az alábbi példakód bemutatja a , SetApartmentStateés TrySetApartmentState a GetApartmentStatemetódusokat. A példakód létrehoz egy szálat. A szál elindítása előtt megjeleníti a kezdeti ApartmentState.Unknown állapotot, GetApartmentState és SetApartmentState az állapotot a következőre ApartmentState.STAmódosítja: . A TrySetApartmentState metódus ezután visszavált false , amikor megkísérli módosítani az állapotot ApartmentState.MTA , mert a lakás állapota már be van állítva. Ha ugyanezt a műveletet kísérelték SetApartmentStatevolna meg, InvalidOperationException akkor a rendszer dobta volna.

A szál elindítása után a rendszer újra alkalmazza a TrySetApartmentState metódust. Ezúttal azért dob, ThreadStateException mert a szál már elindult.

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.

Megjegyzések

Az új szálak inicializálása úgy történik, mintha ApartmentState.MTA a lakás állapota nem lett volna beállítva a kezdés előtt. A lakás állapotát a szál indítása előtt be kell állítani.

Note

A fő alkalmazásszál alapértelmezés szerint inicializálva ApartmentState.MTA van. A fő alkalmazásszál ApartmentState.STA lakásállapotának beállításának egyetlen módja az attribútum alkalmazása STAThreadAttribute a belépési pont metódusára.

A TrySetApartmentState metódus a metódussal és a GetApartmentStateSetApartmentState metódussal együtt lecseréli a tulajdonságot ApartmentState .

A következőre érvényes: