ApartmentState Enumeration
Definition
Wichtig
Einige Informationen beziehen sich auf Vorabversionen, die vor dem Release ggf. grundlegend überarbeitet werden. Microsoft übernimmt hinsichtlich der hier bereitgestellten Informationen keine Gewährleistungen, seien sie ausdrücklich oder konkludent.
Gibt den Wohnungszustand eines Threadan.
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
- Vererbung
- Attribute
Felder
| Name | Wert | Beschreibung |
|---|---|---|
| STA | 0 | Der Thread Wille erstellt und ein Singlethread-Apartment ein. |
| MTA | 1 | Der Thread Wille erstellt und betritt eine Multithread-Wohnung. |
| Unknown | 2 | Die ApartmentState Eigenschaft wurde nicht festgelegt. |
Beispiele
Im folgenden Codebeispiel wird veranschaulicht, wie der Apartmentzustand eines Threads festgelegt wird.
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
Hinweise
Eine Wohnung ist ein logischer Container innerhalb eines Prozesses für Objekte, die dieselben Threadzugriffsanforderungen aufweisen. Alle Objekte in derselben Wohnung können Anrufe von jedem Thread in der Wohnung empfangen. .NET Framework verwendet keine Apartments, und verwaltete Objekte sind dafür verantwortlich, alle gemeinsam genutzten Ressourcen auf threadsichere Weise selbst zu verwenden.
Da COM-Klassen Wohnungen verwenden, muss die Common Language Runtime ein Apartment erstellen und initialisieren, wenn ein COM-Objekt in einer COM-Interoperabilitätssituation aufgerufen wird. Ein verwalteter Thread kann ein Singlethreaded Apartment (STA) erstellen und eingeben, das nur einen Thread oder ein Multithread-Apartment (MTA) mit mindestens einem Threads zulässt. Sie können den Typ der erstellten Wohnung steuern, indem Sie die ApartmentState Eigenschaft des Threads auf einen der Werte der ApartmentState Enumeration festlegen. Da ein bestimmter Thread nur einmal ein COM-Apartment initialisieren kann, können Sie den Apartmenttyp nach dem ersten Aufruf des nicht verwalteten Codes nicht ändern.
Weitere Informationen finden Sie unter Thread" Verwaltete und nicht verwaltete Threading" und "Erweiterte COM-Interoperabilität".