Thread.GetApartmentState 方法
定义
重要
一些信息与预发行产品相关,相应产品在发行之前可能会进行重大修改。 对于此处提供的信息,Microsoft 不作任何明示或暗示的担保。
返回表示单元状态的 ApartmentState 值。
public:
System::Threading::ApartmentState GetApartmentState();
public System.Threading.ApartmentState GetApartmentState ();
member this.GetApartmentState : unit -> System.Threading.ApartmentState
Public Function GetApartmentState () As ApartmentState
返回
其中一个表示托管线程的单元状态的 ApartmentState 值。 默认值为 Unknown。
示例
下面的代码示例演示 、 GetApartmentStateSetApartmentState和 TrySetApartmentState 方法。 该代码示例创建一个线程。 在线程启动之前, GetApartmentState 显示初始 ApartmentState.Unknown 状态并将 SetApartmentState 状态更改为 ApartmentState.STA。 然后,TrySetApartmentState当尝试将状态ApartmentState.MTA更改为 时, 方法将返回 false
,因为单元状态已设置。 如果尝试了 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.
*/
open System.Threading
let threadProc () = Thread.Sleep 2000
let t = Thread threadProc
printfn $"Before setting apartment state: {t.GetApartmentState()}"
t.SetApartmentState ApartmentState.STA
printfn $"After setting apartment state: {t.GetApartmentState()}"
let result = t.TrySetApartmentState ApartmentState.MTA
printfn $"Try to change state: {result}"
t.Start()
Thread.Sleep 500
try
t.TrySetApartmentState ApartmentState.STA |> ignore
with :? ThreadStateException ->
printfn "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.
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.
注解
此方法与 方法和 TrySetApartmentState 方法一起SetApartmentState替换 ApartmentState 属性。