ApartmentState Enumeração
Definição
Importante
Algumas informações dizem respeito a um produto pré-lançado que pode ser substancialmente modificado antes de ser lançado. A Microsoft não faz garantias, de forma expressa ou implícita, em relação à informação aqui apresentada.
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
- 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.