Compartir a través de


ApartmentState Enumeración

Definición

Especifica el estado de apartamento de un Thread.

public enum class ApartmentState
public enum ApartmentState
[System.Serializable]
public enum ApartmentState
[System.Serializable]
[System.Runtime.InteropServices.ComVisible(true)]
public enum ApartmentState
type ApartmentState = 
[<System.Serializable>]
type ApartmentState = 
[<System.Serializable>]
[<System.Runtime.InteropServices.ComVisible(true)>]
type ApartmentState = 
Public Enum ApartmentState
Herencia
ApartmentState
Atributos

Campos

MTA 1

Thread creará y entrará en un apartamento multiproceso.

STA 0

Thread creará y entrará en un contenedor uniproceso.

Unknown 2

No se ha establecido el valor de la propiedad ApartmentState.

Ejemplos

En el ejemplo de código siguiente se muestra cómo establecer el estado de apartamento de un subproceso.

using namespace System;
using namespace System::Threading;
ref class ApartmentTest
{
public:
   static void ThreadMethod()
   {
      Thread::Sleep( 1000 );
   }

};

int main()
{
   Thread^ newThread = gcnew Thread( gcnew ThreadStart( &ApartmentTest::ThreadMethod ) );
   newThread->SetApartmentState(ApartmentState::MTA);
   
   Console::WriteLine( "ThreadState: {0}, ApartmentState: {1}", newThread->ThreadState.ToString(), newThread->GetApartmentState().ToString() );
   newThread->Start();
   
   // Wait for newThread to start and go to sleep.
   Thread::Sleep( 300 );
   try
   {
      
      // This causes an exception since newThread is sleeping.
      newThread->SetApartmentState(ApartmentState::STA);
   }
   catch ( ThreadStateException^ stateException ) 
   {
      Console::WriteLine( "\n{0} caught:\n"
      "Thread is not in the Unstarted or Running state.", stateException->GetType()->Name );
      Console::WriteLine( "ThreadState: {0}, ApartmentState: {1}", newThread->ThreadState.ToString(), newThread->GetApartmentState().ToString() );
   }

}
using System;
using System.Threading;

class ApartmentTest
{
    static void Main()
    {
        Thread newThread = 
            new Thread(new ThreadStart(ThreadMethod));
        newThread.SetApartmentState(ApartmentState.MTA);

        Console.WriteLine("ThreadState: {0}, ApartmentState: {1}", 
            newThread.ThreadState, newThread.GetApartmentState());

        newThread.Start();

        // Wait for newThread to start and go to sleep.
        Thread.Sleep(300);
        try
        {
            // This causes an exception since newThread is sleeping.
            newThread.SetApartmentState(ApartmentState.STA);
        }
        catch(ThreadStateException stateException)
        {
            Console.WriteLine("\n{0} caught:\n" +
                "Thread is not in the Unstarted or Running state.", 
                stateException.GetType().Name);
            Console.WriteLine("ThreadState: {0}, ApartmentState: {1}",
                newThread.ThreadState, newThread.GetApartmentState());
        }
    }

    static void ThreadMethod()
    {
        Thread.Sleep(1000);
    }
}
Imports System.Threading

Public Class ApartmentTest

    <MTAThread> _
    Shared Sub Main()
    
        Dim newThread As Thread = New Thread(AddressOf ThreadMethod)
        newThread.SetApartmentState(ApartmentState.MTA)

        Console.WriteLine("ThreadState: {0}, ApartmentState: {1}", _
            newThread.ThreadState, newThread.GetApartmentState())

        newThread.Start()

        ' Wait for newThread to start and go to sleep.
        Thread.Sleep(300)
        Try
            ' This causes an exception since newThread is sleeping.
            newThread.SetApartmentState(ApartmentState.STA)
        Catch stateException As ThreadStateException
            Console.WriteLine(vbCrLf & "{0} caught:" & vbCrLf & _
                "Thread is not In the Unstarted or Running state.", _
                stateException.GetType().Name)
            Console.WriteLine("ThreadState: {0}, ApartmentState: " & _
                "{1}", newThread.ThreadState, newThread.GetApartmentState())
        End Try

    End Sub

    Shared Sub ThreadMethod()
        Thread.Sleep(1000)
    End Sub

End Class

Comentarios

Un apartamento es un contenedor lógico dentro de un proceso para objetos que comparten los mismos requisitos de acceso a subprocesos. Todos los objetos del mismo apartamento pueden recibir llamadas desde cualquier subproceso del apartamento. El .NET Framework no usa apartamentos y los objetos administrados son responsables de usar todos los recursos compartidos de manera segura para subprocesos.

Dado que las clases COM usan apartamentos, Common Language Runtime debe crear e inicializar un apartamento al llamar a un objeto COM en una situación de interoperabilidad COM. Un subproceso administrado puede crear y escribir un apartamento de un solo subproceso (STA) que permita solo un subproceso o un apartamento multiproceso (MTA) que contenga uno o varios subprocesos. Puede controlar el tipo de apartamento creado estableciendo la ApartmentState propiedad del subproceso en uno de los valores de la ApartmentState enumeración. Dado que un subproceso determinado solo puede inicializar un apartamento COM una vez, no puede cambiar el tipo de apartamento después de la primera llamada al código no administrado.

Para obtener más información, vea Thread, Subprocesos administrados y no administrados y Interoperabilidad COM avanzada.

Se aplica a

Consulte también