Поделиться через


ApartmentState Перечисление

Определение

Указывает состояние квартиры 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
Наследование
ApartmentState
Атрибуты

Поля

Имя Значение Описание
STA 0

Будет Thread создан и введена однопоточная квартира.

MTA 1

Будет Thread создан и введена многопоточность квартиры.

Unknown 2

Свойство ApartmentState не задано.

Примеры

В следующем примере кода показано, как задать состояние квартиры потока.

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

Комментарии

Квартира является логическим контейнером в процессе для объектов, совместного использования одинаковых требований к доступу к потокам. Все объекты в одной квартире могут получать звонки из любого потока в квартире. Платформа .NET Framework не использует квартиры, а управляемые объекты отвечают за использование всех общих ресурсов в потокобезопасном режиме.

Так как классы COM используют квартиры, среда CLR должна создавать и инициализировать квартиру при вызове COM-объекта в ситуации взаимодействия COM. Управляемый поток может создать и ввести однопотоковую квартиру (STA), которая разрешает только один поток или многопоточную квартиру (MTA), содержащую один или несколько потоков. Вы можете управлять типом квартиры, созданной, задав ApartmentState свойству потока одно из значений ApartmentState перечисления. Так как данный поток может инициализировать только COM-квартиру один раз, вы не можете изменить тип квартиры после первого вызова неуправляемого кода.

Дополнительные сведения см. в разделе Thread" Управляемые и неуправляемые потоки" и"Расширенное взаимодействие COM".

Применяется к

См. также раздел