次の方法で共有


Thread.TrySetApartmentState(ApartmentState) メソッド

定義

スレッドを開始する前にそのアパートメント状態を設定します。

public:
 bool TrySetApartmentState(System::Threading::ApartmentState state);
public bool TrySetApartmentState (System.Threading.ApartmentState state);
member this.TrySetApartmentState : System.Threading.ApartmentState -> bool
Public Function TrySetApartmentState (state As ApartmentState) As Boolean

パラメーター

state
ApartmentState

新しいアパートメント状態。

戻り値

アパートメント状態が設定されている場合は true。それ以外の場合は false

例外

.NET Core と .NET 5 以降のみ: macOS と Linux のすべての場合。

state は有効なアパートメント状態ではありません。

スレッドが開始され、終了したか、スレッドの実行中にスレッドのコンテキストから呼び出しが行われていません。

次のコード例では、および TrySetApartmentState メソッドをGetApartmentStateSetApartmentState示します。 このコード例では、スレッドを作成します。 スレッドが開始される前に、 GetApartmentState 初期状態 ApartmentState.Unknown が表示され、 SetApartmentState 状態が に ApartmentState.STA変更されます。 その後、TrySetApartmentStateアパートメントの状態が既に設定されているため、状態を にApartmentState.MTA変更しようとすると、 メソッドが を返falseします。 で同じ操作が試行されたSetApartmentStateInvalidOperationException場合は、 がスローされます。

スレッドが開始されると、 メソッドが 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.

注釈

新しいスレッドは、アパートメント状態が開始される前に設定されていないかのように初期化 ApartmentState.MTA されます。 アパートメントの状態は、スレッドを開始する前に設定する必要があります。

Note

メイン アプリケーション スレッドは、既定で に ApartmentState.MTA 初期化されます。 メイン アプリケーション スレッドのアパートメント状態を に設定する ApartmentState.STA 唯一の方法は、 属性を STAThreadAttribute エントリ ポイント メソッドに適用することです。

メソッドと TrySetApartmentState メソッドは GetApartmentState 、 プロパティを SetApartmentState 置き換えます ApartmentState

適用対象