Thread.SetApartmentState(ApartmentState) 方法   
定义
重要
一些信息与预发行产品相关,相应产品在发行之前可能会进行重大修改。 对于此处提供的信息,Microsoft 不作任何明示或暗示的担保。
在线程启动前设置其单元状态。
public:
 void SetApartmentState(System::Threading::ApartmentState state);[System.Runtime.Versioning.SupportedOSPlatform("windows")]
public void SetApartmentState (System.Threading.ApartmentState state);public void SetApartmentState (System.Threading.ApartmentState state);[<System.Runtime.Versioning.SupportedOSPlatform("windows")>]
member this.SetApartmentState : System.Threading.ApartmentState -> unitmember this.SetApartmentState : System.Threading.ApartmentState -> unitPublic Sub SetApartmentState (state As ApartmentState)参数
- state
- ApartmentState
新的单元状态。
- 属性
例外
仅 .NET Core 和 .NET 5+ :在 macOS 和 Linux 上的所有情况下。
state 不是有效的单元状态。
线程已启动。
已初始化单元状态。
示例
下面的代码示例演示 GetApartmentState 了 、 SetApartmentState 和 TrySetApartmentState 方法。 该代码示例创建一个线程。 在线程启动之前, GetApartmentState 显示初始 ApartmentState.Unknown 状态, SetApartmentState 将状态更改为 ApartmentState.STA 。 然后 TrySetApartmentState , 方法在尝试将状态更改为 false 时 ApartmentState.MTA 返回 ,因为单元状态已设置。 如果已使用 尝试相同的操作 SetApartmentState , InvalidOperationException 则会引发 。
线程启动后, TrySetApartmentState 将再次使用 方法。 这一次会引发 ThreadStateException ,因为线程已启动。
using namespace System;
using namespace System::Threading;
void ThreadProc()
{
    Thread::Sleep(2000);
};
void main()
{
    Thread^ t = gcnew Thread(gcnew ThreadStart(ThreadProc));
    Console::WriteLine("Before setting apartment state: {0}", 
            t->GetApartmentState());
    t->SetApartmentState(ApartmentState::STA);
    Console::WriteLine("After setting apartment state: {0}", 
        t->GetApartmentState());
    bool result = t->TrySetApartmentState(ApartmentState::MTA);
    Console::WriteLine("Try to change state: {0}", result);
    t->Start();
    Thread::Sleep(500);
    try
    {
        t->TrySetApartmentState(ApartmentState::STA);
    }
    catch (ThreadStateException^)
    {
        Console::WriteLine("ThreadStateException occurs " +
            "if apartment state is set after starting thread.");
    }
    t->Join();
}
/* This code example produces the following output:
Before setting apartment state: Unknown
After setting apartment state: STA
Try to change state: False
ThreadStateException occurs if apartment state is set after starting thread.
 */
using System;
using System.Threading;
class Example
{
    public static void Main()
    {
        Thread t = new Thread(ThreadProc);
        Console.WriteLine("Before setting apartment state: {0}",
            t.GetApartmentState());
        t.SetApartmentState(ApartmentState.STA);
        Console.WriteLine("After setting apartment state: {0}",
            t.GetApartmentState());
        bool result = t.TrySetApartmentState(ApartmentState.MTA);
        Console.WriteLine("Try to change state: {0}", result);
        t.Start();
        Thread.Sleep(500);
        try
        {
            t.TrySetApartmentState(ApartmentState.STA);
        }
        catch (ThreadStateException)
        {
            Console.WriteLine("ThreadStateException occurs " +
                "if apartment state is set after starting thread.");
        }
        t.Join();
    }
    public static void ThreadProc()
    {
        Thread.Sleep(2000);
    }
}
/* This code example produces the following output:
Before setting apartment state: Unknown
After setting apartment state: STA
Try to change state: False
ThreadStateException occurs if apartment state is set after starting thread.
 */
Imports System.Threading
Module Example
    Sub Main()
 
        Dim t As New Thread(AddressOf ThreadProc)
        Console.WriteLine("Before setting apartment state: {0}", _
            t.GetApartmentState())
        t.SetApartmentState(ApartmentState.STA)
        Console.WriteLine("After setting apartment state: {0}", _
            t.GetApartmentState())
        Dim result As Boolean = _
            t.TrySetApartmentState(ApartmentState.MTA)
        Console.WriteLine("Try to change state: {0}", result)
        t.Start()
        Thread.Sleep(500)
        Try
            t.TrySetApartmentState(ApartmentState.STA)
        Catch ex As ThreadStateException
            Console.WriteLine("ThreadStateException occurs " & _
                "if apartment state is set after starting thread.")
        End Try
        t.Join()
    End Sub
    Sub ThreadProc()
        Thread.Sleep(2000)
    End Sub
End Module
' This code example produces the following output:
'
'Before setting apartment state: Unknown
'After setting apartment state: STA
'Try to change state: False
'ThreadStateException occurs if apartment state is set after starting thread.
注解
新线程的初始化就像在启动之前尚未设置单元 ApartmentState.MTA 状态一样。 单元状态必须在线程启动前设置。
备注
默认情况下,主应用程序线程初始化为 ApartmentState.MTA 。 将主应用程序线程的单元状态设置为 的唯一方法是将 属性 ApartmentState.STA STAThreadAttribute 应用于入口点方法。
SetApartmentState方法与 方法和 方法一起 GetApartmentState 替换 TrySetApartmentState ApartmentState 属性。