ApartmentState Enumeração

Definição

Especifica o estado do apartamento de um Thread.

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

Campos

Name Valor Description
STA 0

Eles Thread criam e entram num apartamento de uma só linha.

MTA 1

Eles Thread criam e entram num apartamento multithread.

Unknown 2

A ApartmentState propriedade ainda não foi definida.

Exemplos

O exemplo de código seguinte demonstra como definir o estado do apartamento de uma thread.

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

Observações

Um apartamento é um contentor lógico dentro de um processo para objetos que partilham os mesmos requisitos de acesso ao thread. Todos os objetos no mesmo apartamento podem receber chamadas de qualquer thread dentro do apartamento. O .NET Framework não utiliza apartamentos, e os objetos geridos são responsáveis por usar todos os recursos partilhados de forma segura para threads.

Como as classes COM usam apartamentos, o runtime da linguagem comum precisa de criar e inicializar um apartamento ao chamar um objeto COM numa situação de interoperabilidade COM. Uma thread gerida pode criar e entrar num apartamento single-threaded (STA) que permite apenas uma thread, ou num apartamento multithread (MTA) que contém uma ou mais threads. Pode controlar o tipo de apartamento criado definindo a ApartmentState propriedade da thread para um dos valores da ApartmentState enumeração. Como um determinado thread só pode inicializar um apartamento COM uma vez, não podes mudar o tipo de apartamento após a primeira chamada para o código não gerido.

Para mais informações, veja Thread, Threading Gerido e Não Gerido, e Interoperabilidade Avançada COM.

Aplica-se a

Ver também