Thread.TrySetApartmentState(ApartmentState) Метод

Определение

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

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

Параметры

state
ApartmentState

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

Возвращаемое значение

Boolean

Значение true, если задана модель "apartment"; в противном случае — значение false.

Исключения

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

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

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