Thread.TrySetApartmentState(ApartmentState) Méthode

Définition

Définit l'état de cloisonnement d'un thread avant qu'il ne soit démarré.

C#
public bool TrySetApartmentState (System.Threading.ApartmentState state);

Paramètres

state
ApartmentState

Nouvel état de cloisonnement.

Retours

Boolean

true si l'état de cloisonnement est défini ; sinon, false.

Exceptions

.NET Core et .NET 5 + uniquement : dans tous les cas sur macOS et Linux.

state n’est pas un état de cloisonnement valide.

Le thread a démarré et s’est arrêté, ou l’appel n’est pas effectué depuis le contexte du thread pendant que le thread est en cours d’exécution.

Exemples

L’exemple de code suivant illustre GetApartmentState les SetApartmentState méthodes, et TrySetApartmentState . L’exemple de code crée un thread. Avant le démarrage du thread, GetApartmentState affiche l' ApartmentState.Unknown état initial et SetApartmentState passe à l’état ApartmentState.STA . La TrySetApartmentState méthode retourne ensuite false lorsque la tentative de modification de l’état ApartmentState.MTA est définie sur car l’état de cloisonnement est déjà défini. Si la même opération a été tentée avec SetApartmentState , InvalidOperationException aurait été levé.

Une fois le thread démarré, la TrySetApartmentState méthode est réutilisée. Cette fois-ci, il lève une exception ThreadStateException car le thread a déjà été démarré.

C#
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.
 */

Remarques

Les nouveaux threads sont initialisés comme ApartmentState.MTA si leur état de cloisonnement n’avait pas été défini avant de démarrer. L’état de cloisonnement doit être défini avant le démarrage d’un thread.

Remarque

Le thread d’application principal est initialisé ApartmentState.MTA par défaut. La seule façon de définir l’état de cloisonnement du thread d’application principal sur ApartmentState.STA consiste à appliquer l' STAThreadAttribute attribut à la méthode de point d’entrée.

La TrySetApartmentState méthode, ainsi que la méthode GetApartmentState et la SetApartmentState méthode, remplacent la ApartmentState propriété.

S’applique à

Produit Versions
.NET Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7
.NET Framework 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8
.NET Standard 2.0, 2.1