ApartmentState Wyliczenie
Definicja
Ważne
Niektóre informacje odnoszą się do produktu w wersji wstępnej, który może zostać znacząco zmodyfikowany przed wydaniem. Firma Microsoft nie udziela żadnych gwarancji, jawnych lub domniemanych, w odniesieniu do informacji podanych w tym miejscu.
Określa stan mieszkania obiektu 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
- Dziedziczenie
- Atrybuty
Pola
MTA | 1 | Zostanie Thread utworzony i wprowadzony wielowątkowy apartament. |
STA | 0 | Zostanie Thread utworzony i wprowadzony jednowątkowy apartament. |
Unknown | 2 | Właściwość nie została ustawiona ApartmentState . |
Przykłady
W poniższym przykładzie kodu pokazano, jak ustawić stan mieszkania wątku.
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
Uwagi
Mieszkanie jest kontenerem logicznym w ramach procesu dla obiektów współużytkowania tych samych wymagań dostępu wątku. Wszystkie obiekty w tym samym mieszkaniu mogą odbierać połączenia z dowolnego wątku w mieszkaniu. .NET Framework nie korzysta z mieszkań, a obiekty zarządzane są odpowiedzialne za samodzielne korzystanie ze wszystkich udostępnionych zasobów w sposób bezpieczny wątkowo.
Ponieważ klasy COM używają mieszkań, środowisko uruchomieniowe języka wspólnego musi utworzyć i zainicjować mieszkanie podczas wywoływania obiektu COM w sytuacji międzyoperacyjnej modelu COM. Zarządzany wątek może tworzyć i wprowadzać jednowątkowy apartament (STA), który umożliwia tylko jeden wątek lub wielowątkowy apartament (MTA), który zawiera co najmniej jeden wątek. Typ mieszkania utworzonego można kontrolować, ustawiając ApartmentState właściwość wątku na jedną z wartości ApartmentState wyliczenia. Ponieważ dany wątek może zainicjować apartament COM tylko raz, nie można zmienić typu mieszkania po pierwszym wywołaniu niezarządzanego kodu.
Aby uzyskać więcej informacji, zobacz Thread, Managed and Unmanaged Threading (Zarządzane i niezarządzane wątki) oraz Advanced COM Interoperability (Zaawansowane współdziałanie modelu COM).