Thread.TrySetApartmentState(ApartmentState) Yöntem

Tanım

Bir iş parçacığının başlatılamadan önce küme durumunu ayarlar.

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

Parametreler

state
ApartmentState

Yeni eyalet durumu.

Döndürülenler

Boolean

true daire durumu ayarlanmışsa; aksi takdirde, false .

Özel durumlar

Yalnızca .NET Core ve .NET 5+ : MacOS ve Linux'ta her durumda.

state geçerli bir ev durumu değildir.

İş parçacığı başlatıldı ve sonlandırıldı veya iş parçacığı çalışırken iş parçacığının bağlamından çağrı çalışmıyor.

Örnekler

Aşağıdaki kod örneği , GetApartmentState SetApartmentState ve yöntemlerini TrySetApartmentState gösteriyor. Kod örneği bir iş parçacığı oluşturur. İş parçacığı başlamadan önce, GetApartmentState ilk durumu görüntüler ve durumu olarak ApartmentState.Unknown SetApartmentState ApartmentState.STA değiştirir. Yöntem TrySetApartmentState daha sonra durumu olarak değiştirmeye çalışırken döndürür çünkü küme durumu zaten ayarlanmış false ApartmentState.MTA durumdadır. ile aynı işlem SetApartmentState InvalidOperationException denenirse, atılan olurdu.

İş parçacığı başlatıldıktan sonra TrySetApartmentState yöntemi yeniden kullanılır. İş parçacığı zaten ThreadStateException başlatmış olduğundan bu kez atıyor.

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.

Açıklamalar

Yeni iş parçacıkları, ApartmentState.MTA başlatılmadan önce kendi evlerinin durumu ayarlanmmış gibi başlatılır. Bir iş parçacığı başlamadan önce küme durumu ayar gerekir.

Not

Ana uygulama iş parçacığı varsayılan olarak ApartmentState.MTA olarak başlatılır. Ana uygulama iş parçacığının durumunu olarak ayarlamanın tek ApartmentState.STA yolu, özniteliğini STAThreadAttribute giriş noktası yöntemine uygulamaktır.

TrySetApartmentStateyöntemi, yöntemi ve GetApartmentState SetApartmentState yöntemiyle birlikte özelliğinin yerini ApartmentState almaktadır.

Şunlara uygulanır