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 Apartmentzustand eines Thread an.
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
MTA | 1 | Der Thread erstellt ein MTA (Multithreaded Apartment) und wird in dieses aufgenommen. |
STA | 0 | Der Thread erstellt ein STA (Singlethreaded Apartment) und wird in dieses aufgenommen. |
Unknown | 2 | Die ApartmentState-Eigenschaft wurde nicht festgelegt. |
Beispiele
Im folgenden Codebeispiel wird veranschaulicht, wie der Wohnungszustand 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 in einem Prozess für Objekte, die dieselben Threadzugriffsanforderungen teilen. Alle Objekte in derselben Wohnung können Anrufe von jedem Thread in der Wohnung empfangen. Die .NET Framework verwendet keine Wohnungen, und verwaltete Objekte sind dafür verantwortlich, alle freigegebenen Ressourcen auf eine threadsichere Weise selbst zu verwenden.
Da COM-Klassen Wohnungen verwenden, muss die allgemeine Sprachlaufzeit eine Wohnung beim Aufrufen eines COM-Objekts in einer COM-Interop-Situation erstellen und initialisieren. Ein verwalteter Thread kann eine einzelthreadierte Wohnung (STA) erstellen und eingeben, die nur einen Thread oder eine Multithread-Wohnung (MTA) ermöglicht, die einen oder mehrere Threads enthält. Sie können den Typ der Wohnung steuern, die erstellt wird, indem Sie die ApartmentState Eigenschaft des Threads auf einen der Werte der ApartmentState Enumeration festlegen. Da ein bestimmtes Thread nur einmal eine COM-Wohnung initialisieren kann, können Sie den Wohnungstyp nach dem ersten Aufruf des nicht verwalteten Codes nicht ändern.
Weitere Informationen finden Sie unter Thread, verwaltete und nicht verwaltete Threadings und Erweiterte COM-Interoperabilität.