Thread.ApartmentState Свойство

Определение

Предупреждение

Этот API устарел.

Возвращает или задает модель "apartment" для данного потока.Gets or sets the apartment state of this thread.

public:
 property System::Threading::ApartmentState ApartmentState { System::Threading::ApartmentState get(); void set(System::Threading::ApartmentState value); };
[System.Obsolete("Deprecated in favor of GetApartmentState, SetApartmentState and TrySetApartmentState.")]
[System.Obsolete("The ApartmentState property has been deprecated.  Use GetApartmentState, SetApartmentState or TrySetApartmentState instead.", false)]
public System.Threading.ApartmentState ApartmentState { get; set; }
member this.ApartmentState : System.Threading.ApartmentState with get, set
Public Property ApartmentState As ApartmentState

Значение свойства

Одно из значений ApartmentState.One of the ApartmentState values. Начальное значение — Unknown.The initial value is Unknown.

Атрибуты

Исключения

Предпринята попытка задать в этом свойстве состояние, которое не является допустимым состоянием подразделения (состояние, отличное от однопотокового подразделения (STA) или многопотокового подразделения (MTA)).An attempt is made to set this property to a state that is not a valid apartment state (a state other than single-threaded apartment (STA) or multithreaded apartment (MTA)).

Примеры

В следующем примере кода показано, как задать состояние подразделения потока.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

Комментарии

Свойство ApartmentState устарело.The ApartmentState property is obsolete. Неустаревшие альтернативы — метод GetApartmentState для получения состояния апартамента и метод SetApartmentState для задания состояния апартамента.The non-obsolete alternatives are the GetApartmentState method to retrieve the apartment state and the SetApartmentState method to set the apartment state.

В .NET Framework версиях 1,0 и 1,1 свойство ApartmentState помечает поток, чтобы указать, что он будет выполняться в однопотоковой или многопоточной подразделении.In the .NET Framework versions 1.0 and 1.1, the ApartmentState property marks a thread to indicate that it will execute in a single-threaded or multithreaded apartment. Это свойство можно задать, если поток находится в Unstarted или Running состоянии потока. Однако его можно задать только один раз для потока.This property can be set when the thread is in the Unstarted or Running thread state; however, it can be set only once for a thread. Если свойство не задано, оно возвращает Unknown.If the property has not been set, it returns Unknown.

Попытка использовать свойство ApartmentState для задания состояния подразделения потока, состояние апартамента которого уже задано, игнорируется.An attempt to use the ApartmentState property to set the apartment state of a thread whose apartment state has already been set is ignored. Однако в этом случае метод SetApartmentState создает InvalidOperationException.However, the SetApartmentState method throws a InvalidOperationException in this case.

Важно!

В .NET Framework версии 2,0 новые потоки инициализируются как ApartmentState.MTA, если их состояние апартамента не было задано до запуска.In the .NET Framework version 2.0, new threads are initialized as ApartmentState.MTA if their apartment state has not been set before they are started. Основной поток приложения инициализируется для ApartmentState.MTA по умолчанию.The main application thread is initialized to ApartmentState.MTA by default. Вы больше не можете задать для основного потока приложения ApartmentState.STA, установив свойство System.Threading.ApartmentState в первой строке кода.You can no longer set the main application thread to ApartmentState.STA by setting the System.Threading.ApartmentState property on the first line of code. Вместо этого используйте STAThreadAttribute.Use the STAThreadAttribute instead.

В .NET Framework версии 2,0 можно указать COM-потоковую модель для C++ приложения с помощью параметра компоновщика /CLRTHREADATTRIBUTE (Установка атрибута потока CLR) .In the .NET Framework version 2.0, you can specify the COM threading model for a C++ application using the /CLRTHREADATTRIBUTE (Set CLR Thread Attribute) linker option.

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

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