Freigeben über


ApartmentState Enumeration

Definition

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

Gilt für:

Weitere Informationen