Freigeben über


ApartmentState Enumeration

Definition

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
ApartmentState
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.

Gilt für

Siehe auch