Thread.SetApartmentState(ApartmentState) Método

Definición

Establece el estado del apartamento de un subproceso antes de iniciarse.Sets the apartment state of a thread before it is started.

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

Nuevo estado del apartamento.The new apartment state.

Excepciones

Solo .NET Core: este miembro no se admite en las plataformas macOS y Linux..NET Core only: This member is not supported on the macOS and Linux platforms.

state no es un estado del apartamento válido.state is not a valid apartment state.

Ya se inició el subproceso.The thread has already been started.

El estado de apartamento ya se inicializó.The apartment state has already been initialized.

Ejemplos

En el ejemplo de código siguiente se muestran los métodos GetApartmentState, SetApartmentState y TrySetApartmentState.The following code example demonstrates the GetApartmentState, SetApartmentState, and TrySetApartmentState methods. En el ejemplo de código se crea un subproceso.The code example creates a thread. Antes de que se inicie el subproceso, GetApartmentState muestra el estado inicial de ApartmentState.Unknown y SetApartmentState cambia el estado a ApartmentState.STA.Before the thread is started, GetApartmentState displays the initial ApartmentState.Unknown state and SetApartmentState changes the state to ApartmentState.STA. A continuación, el método TrySetApartmentState devuelve false al intentar cambiar el estado a ApartmentState.MTA porque el estado del apartamento ya está establecido.The TrySetApartmentState method then returns false when attempting to change the state to ApartmentState.MTA because the apartment state is already set. Si se ha intentado la misma operación con SetApartmentState, se habría producido InvalidOperationException.If the same operation had been attempted with SetApartmentState, InvalidOperationException would have been thrown.

Una vez iniciado el subproceso, se vuelve a usar el método TrySetApartmentState.After the thread is started, the TrySetApartmentState method is used again. Esta vez se produce ThreadStateException porque el subproceso ya se ha iniciado.This time it throws ThreadStateException because the thread has already been started.

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.

Comentarios

Los nuevos subprocesos se inicializan como ApartmentState.MTA si su estado de apartamento no se ha establecido antes de que se inicien.New threads are initialized as ApartmentState.MTA if their apartment state has not been set before they are started. El estado de apartamento debe establecerse antes de iniciar un subproceso.Apartment state must be set before a thread is started.

Nota

El subproceso principal de la aplicación se inicializa en ApartmentState.MTA de forma predeterminada.The main application thread is initialized to ApartmentState.MTA by default. La única manera de establecer el estado del apartamento del subproceso de aplicación principal en ApartmentState.STA es aplicar el atributo STAThreadAttribute al método de punto de entrada.The only way to set the apartment state of the main application thread to ApartmentState.STA is to apply the STAThreadAttribute attribute to the entry point method.

El método SetApartmentState, junto con el método GetApartmentState y el método TrySetApartmentState, reemplaza a la propiedad ApartmentState.The SetApartmentState method, along with the GetApartmentState method and the TrySetApartmentState method, replaces the ApartmentState property.

Se aplica a