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

Определение

Задает апартаментное состояние потока Thread.Specifies the apartment state of a Thread.

public enum class ApartmentState
[System.Runtime.InteropServices.ComVisible(true)]
[System.Serializable]
public enum ApartmentState
type ApartmentState = 
Public Enum ApartmentState
Наследование
ApartmentState
Атрибуты

Поля

MTA 1

Объект Thread создаст многопоточный апартамент и войдет в него.The Thread will create and enter a multithreaded apartment.

STA 0

Объект Thread создаст однопоточный апартамент и войдет в него.The Thread will create and enter a single-threaded apartment.

Unknown 2

Свойство ApartmentState не установлено.The ApartmentState property has not been set.

Примеры

В следующем примере кода показано, как задать состояние подразделения потока.The following code example demonstrates how to set the apartment state of a thread.

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

        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

Комментарии

Апартамент — это логический контейнер внутри процесса для объектов, совместно использующих одинаковые требования к доступу к потокам.An apartment is a logical container within a process for objects sharing the same thread access requirements. Все объекты в одном апартаменте могут принимать вызовы из любого потока в апартаменте.All objects in the same apartment can receive calls from any thread in the apartment. .NET Framework не использует подразделения, а управляемые объекты несут ответственность за использование всех общих ресурсов в безопасном для потоков режиме.The .NET Framework does not use apartments, and managed objects are responsible for using all shared resources in a thread-safe manner themselves.

Поскольку классы COM используют подразделения, среда CLR должна создать и инициализировать апартамент при вызове COM-объекта в ситуации COM-взаимодействия.Because COM classes use apartments, the common language runtime needs to create and initialize an apartment when calling a COM object in a COM interop situation. Управляемый поток может создать и ввести однопотоковое подразделение (STA), которое допускает только один поток или многопотоковое подразделение (MTA), содержащее один или несколько потоков.A managed thread can create and enter a single-threaded apartment (STA) that allows only one thread, or a multithreaded apartment (MTA) that contains one or more threads. Можно управлять типом апартамента, созданным, присвоив ApartmentState свойству потока одно из значений ApartmentState перечисления.You can control the type of apartment created by setting the ApartmentState property of the thread to one of the values of the ApartmentState enumeration. Поскольку данный поток может инициализировать подразделение COM только один раз, невозможно изменить тип подразделения после первого вызова неуправляемого кода.Because a given thread can only initialize a COM apartment once, you cannot change the apartment type after the first call to the unmanaged code.

Дополнительные сведения см Thread. в статьях, управляемые и неуправляемые потоки, а Дополнительно COM-взаимодействие.For more information, see Thread, Managed and Unmanaged Threading, and Advanced COM Interoperability.

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

Дополнительно