.NET Framework
Contextes de synchronisation
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.