Maison > développement back-end > C++ > Comment SynchronizationContext garantit-il les mises à jour de l'interface utilisateur Thread-Safe dans .NET ?

Comment SynchronizationContext garantit-il les mises à jour de l'interface utilisateur Thread-Safe dans .NET ?

Mary-Kate Olsen
Libérer: 2025-01-03 10:16:39
original
254 Les gens l'ont consulté

How Does SynchronizationContext Ensure Thread-Safe UI Updates in .NET?

SynchronizationContext : Exécution de code dans un emplacement spécifique

SynchronizationContext fournit un moyen d'exécuter du code dans un contexte ou un emplacement spécifique. Il fonctionne en capturant les délégués transmis à ses méthodes Send ou Post et en les invoquant dans ce contexte.

Comprendre SynchronizationContext

SynchronizationContext est une classe qui existe dans chaque thread et peut être définie via SynchronizationContext.SetSynchronizationContext ou accessible via SynchronizationContext.Current. Cependant, il convient de noter qu'un SynchronizationContext ne représente pas nécessairement un thread spécifique et peut déléguer des invocations à différents threads ou même à des hôtes distants.

Dans Windows Forms, un WindowsFormsSynchronizationContext est installé sur le thread de l'interface utilisateur lorsque le premier formulaire est créé. Ce contexte garantit que les délégués transmis à Send ou Post sont appelés sur le thread de l'interface utilisateur, ce qui est crucial pour manipuler les contrôles Windows Forms.

Explication du code exemple

L'exemple de code fourni montre comment utiliser SynchronizationContext pour manipuler un contrôle d'interface utilisateur à partir d'un fil de discussion séparé :

SynchronizationContext originalContext = SynchronizationContext.Current;
ThreadPool.QueueUserWorkItem(delegate {
    string text = File.ReadAllText(@"c:\temp\log.txt");
    originalContext.Post(delegate {
        myTextBox.Text = text;
    }, null);
});
Copier après la connexion
  1. Capturez le fil de discussion de l'interface utilisateur SynchronizationContext : La variable originalContext capture le SynchronizationContext du thread de l'interface utilisateur avant de générer une nouvelle tâche.
  2. Exécuter la tâche sur un thread en arrière-plan : Une tâche est créée et exécutée sur un pool de threads thread de travail, qui n'est généralement pas le thread de l'interface utilisateur.
  3. Revenir à l'interface utilisateur Sujet : Après avoir lu le fichier, le code utilise la méthode Post de originalContext pour revenir au thread de l'interface utilisateur et exécuter le délégué qui met à jour myTextBox.Text.

Éviter les violations d'accès au thread de l'interface utilisateur

Dans Windows Forms, l'accès aux contrôles de l'interface utilisateur à partir de threads autres que celui qui les a créés est interdit. Par conséquent, utiliser SynchronizationContext pour revenir au thread de l'interface utilisateur est essentiel pour éviter les exceptions lors de la manipulation d'éléments de l'interface utilisateur à partir d'un autre thread.

Approches alternatives

Depuis .NET 4.5, async / wait combiné avec la tâche La bibliothèque parallèle (TPL) peut grandement simplifier le processus d'exécution de code dans des contextes spécifiques. Ces API capturent automatiquement le SynchronizationContext du thread d'interface utilisateur et y reviennent si nécessaire.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal