Thread.SetApartmentState(ApartmentState) Метод

Определение

Задает модель "apartment" для потока до его запуска.

public:
 void SetApartmentState(System::Threading::ApartmentState state);
[System.Runtime.Versioning.SupportedOSPlatform("windows")]
public void SetApartmentState (System.Threading.ApartmentState state);
public void SetApartmentState (System.Threading.ApartmentState state);
[<System.Runtime.Versioning.SupportedOSPlatform("windows")>]
member this.SetApartmentState : System.Threading.ApartmentState -> unit
member this.SetApartmentState : System.Threading.ApartmentState -> unit
Public Sub SetApartmentState (state As ApartmentState)

Параметры

state
ApartmentState

Новая модель "apartment".

Атрибуты

Исключения

.NET Core и .NET 5 + только: во всех случаях на macOS и Linux.

state не является допустимым состоянием подразделения.

Поток уже запущен.

Состояние подразделения уже инициализировано.

Примеры

В следующем примере кода демонстрируются GetApartmentState SetApartmentState методы, и TrySetApartmentState . В примере кода создается поток. Перед запуском потока GetApartmentState отображает начальное ApartmentState.Unknown состояние и SetApartmentState изменяет состояние на ApartmentState.STA . TrySetApartmentStateЗатем метод возвращается false при попытке изменить состояние на, ApartmentState.MTA так как состояние апартамента уже задано. Если одна и та же операция была предпринята с помощью SetApartmentState , было InvalidOperationException бы создано исключение.

После запуска потока TrySetApartmentState метод используется снова. В этот раз возникает исключение ThreadStateException , поскольку поток уже запущен.

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 атрибут к методу точки входа.

SetApartmentStateМетод, вместе с GetApartmentState методом и TrySetApartmentState методом, заменяет ApartmentState свойство.

Применяется к