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.
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.
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); });
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.
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!