Sobes.tech
Middle

Qu'est-ce que le contexte de synchronisation en C#?

sobes.tech IA

Réponse de l'IA

Le contexte de synchronisation (SynchronizationContext) en C# fournit une abstraction pour la gestion de l'exécution des threads, permettant d'exécuter des délégués dans un contexte spécifique. Il joue un rôle clé dans la gestion des threads GUI (par exemple, WinForms, WPF) et ASP.NET, en assurant la mise à jour correcte des éléments de l'interface ou l'exécution de la logique dans le thread approprié.

Fonctions principales:

  • Send(SendOrPostCallback d, object state): Exécute de manière synchrone un délégué dans le contexte. Le thread appelant est bloqué jusqu'à ce que le délégué ait terminé son exécution.
  • Post(SendOrPostCallback d, object state): Exécute de manière asynchrone un délégué dans le contexte. Le thread appelant n'est pas bloqué.

Exemples d'utilisation:

  • En WPF ou WinForms, SynchronizationContext.Current représentera le thread de l'interface utilisateur. Utiliser Post ou Send permet de mettre à jour en toute sécurité les éléments de l'interface depuis un thread en arrière-plan.
  • En ASP.NET Core, par défaut, SynchronizationContext n'existe pas, et les requêtes sont directement traitées par les threads du pool. Dans les versions plus anciennes d'ASP.NET, un contexte de synchronisation existait, garantissant l'exécution des requêtes dans le même contexte.
// Exemple d'utilisation en WinForms pour mettre à jour l'UI depuis un thread en arrière-plan
private void button1_Click(object sender, EventArgs e)
{
    SynchronizationContext uiContext = SynchronizationContext.Current; // Obtention du contexte du thread UI

    Task.Run(() =>
    {
        // Exécution d'une opération longue dans un thread en arrière-plan
        Thread.Sleep(2000);

        // Mise à jour de l'étiquette via le contexte de synchronisation
        uiContext.Post(_ => label1.Text = "Mis à jour!", null);
    });
}