ApartmentState Enum

Definition

Anger lägenhetstillståndet för en Thread.

public enum class ApartmentState
[System.Serializable]
public enum ApartmentState
[System.Serializable]
[System.Runtime.InteropServices.ComVisible(true)]
public enum ApartmentState
public enum ApartmentState
[<System.Serializable>]
type ApartmentState = 
[<System.Serializable>]
[<System.Runtime.InteropServices.ComVisible(true)>]
type ApartmentState = 
type ApartmentState = 
Public Enum ApartmentState
Arv
ApartmentState
Attribut

Fält

Name Värde Description
STA 0

Kommer Thread att skapa och ange en enkeltrådad lägenhet.

MTA 1

Kommer Thread att skapa och ange en flertrådad lägenhet.

Unknown 2

Egenskapen ApartmentState har inte angetts.

Exempel

Följande kodexempel visar hur du anger lägenhetstillståndet för en tråd.

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

Kommentarer

En lägenhet är en logisk container i en process för objekt som delar samma åtkomstkrav för trådar. Alla objekt i samma lägenhet kan ta emot samtal från valfri tråd i lägenheten. .NET Framework använder inte lägenheter och hanterade objekt ansvarar själva för att använda alla delade resurser på ett trådsäkert sätt.

Eftersom COM-klasser använder lägenheter måste den vanliga språkkörningen skapa och initiera en lägenhet när du anropar ett COM-objekt i en COM-interop-situation. En hanterad tråd kan skapa och ange en enkeltrådad lägenhet (STA) som endast tillåter en tråd eller en flertrådad lägenhet (MTA) som innehåller en eller flera trådar. Du kan styra vilken typ av lägenhet som skapas genom att ange ApartmentState egenskapen för tråden till ett av värdena i ApartmentState uppräkningen. Eftersom en viss tråd bara kan initiera en COM-lägenhet en gång kan du inte ändra lägenhetstypen efter det första anropet till den ohanterade koden.

Mer information finns i Thread, Hanterad och ohanterad trådning och Avancerad COM-samverkan.

Gäller för

Se även