Udostępnij za pośrednictwem


ApartmentState Wyliczenie

Definicja

Określa stan mieszkania obiektu Thread.

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
Dziedziczenie
ApartmentState
Atrybuty

Pola

MTA 1

Zostanie Thread utworzony i wprowadzony wielowątkowy apartament.

STA 0

Zostanie Thread utworzony i wprowadzony jednowątkowy apartament.

Unknown 2

Właściwość nie została ustawiona ApartmentState .

Przykłady

W poniższym przykładzie kodu pokazano, jak ustawić stan mieszkania wątku.

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

Uwagi

Mieszkanie jest kontenerem logicznym w ramach procesu dla obiektów współużytkowania tych samych wymagań dostępu wątku. Wszystkie obiekty w tym samym mieszkaniu mogą odbierać połączenia z dowolnego wątku w mieszkaniu. .NET Framework nie korzysta z mieszkań, a obiekty zarządzane są odpowiedzialne za samodzielne korzystanie ze wszystkich udostępnionych zasobów w sposób bezpieczny wątkowo.

Ponieważ klasy COM używają mieszkań, środowisko uruchomieniowe języka wspólnego musi utworzyć i zainicjować mieszkanie podczas wywoływania obiektu COM w sytuacji międzyoperacyjnej modelu COM. Zarządzany wątek może tworzyć i wprowadzać jednowątkowy apartament (STA), który umożliwia tylko jeden wątek lub wielowątkowy apartament (MTA), który zawiera co najmniej jeden wątek. Typ mieszkania utworzonego można kontrolować, ustawiając ApartmentState właściwość wątku na jedną z wartości ApartmentState wyliczenia. Ponieważ dany wątek może zainicjować apartament COM tylko raz, nie można zmienić typu mieszkania po pierwszym wywołaniu niezarządzanego kodu.

Aby uzyskać więcej informacji, zobacz Thread, Managed and Unmanaged Threading (Zarządzane i niezarządzane wątki) oraz Advanced COM Interoperability (Zaawansowane współdziałanie modelu COM).

Dotyczy

Zobacz też