Recherche…


Remarques

Un contexte de synchronisation est une abstraction qui permet de coder pour transmettre des unités de travail à un planificateur, sans qu'il soit nécessaire de savoir comment le travail sera planifié.

Les contextes de synchronisation sont traditionnellement utilisés pour garantir l’exécution du code sur un thread spécifique. Dans les applications WPF et Winforms, un cadre SynchronizationContext représentant le thread d'interface utilisateur est fourni par le framework de présentation. De cette manière, SynchronizationContext peut être considéré comme un modèle producteur-consommateur pour les délégués. Un thread de travail produira du code exécutable (le délégué) et le mettra en file d'attente ou le consommera par la boucle de message de l'interface utilisateur.

La bibliothèque parallèle de tâches fournit des fonctionnalités permettant de capturer et d'utiliser automatiquement des contextes de synchronisation.

Exécuter du code sur le thread d'interface utilisateur après avoir effectué un travail en arrière-plan

Cet exemple montre comment mettre à jour un composant d'interface utilisateur à partir d'un thread d'arrière-plan en utilisant un SynchronizationContext

void Button_Click(object sender, EventArgs args)
{
    SynchronizationContext context = SynchronizationContext.Current;
    Task.Run(() =>
    {
        for(int i = 0; i < 10; i++) 
        {
            Thread.Sleep(500); //simulate work being done
            context.Post(ShowProgress, "Work complete on item " + i);
        }
    }
}

void UpdateCallback(object state)
{
    // UI can be safely updated as this method is only called from the UI thread
    this.MyTextBox.Text = state as string;
}

Dans cet exemple, si vous MyTextBox.Text mettre à jour directement MyTextBox.Text dans la boucle for , vous obtiendriez une erreur de threading. En publiant l'action UpdateCallback sur le SynchronizationContext , la zone de texte est mise à jour sur le même thread que le reste de l'interface utilisateur.

En pratique, les mises à jour de progression doivent être effectuées à l'aide d'une instance de System.IProgress<T> . L'implémentation par défaut System.Progress<T> capture automatiquement le contexte de synchronisation sur System.Progress<T> elle est créée.



Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow