SynchronizationContext nous fournit un moyen de mettre à jour une interface utilisateur à partir d'un thread différent (de manière synchrone via la méthode Send ou de manière asynchrone via la méthode Post).
Jetez un œil à l'exemple suivant:
private void SynchronizationContext SyncContext = SynchronizationContext.Current;
private void Button_Click(object sender, RoutedEventArgs e)
{
Thread thread = new Thread(Work1);
thread.Start(SyncContext);
}
private void Work1(object state)
{
SynchronizationContext syncContext = state as SynchronizationContext;
syncContext.Post(UpdateTextBox, syncContext);
}
private void UpdateTextBox(object state)
{
Thread.Sleep(1000);
string text = File.ReadAllText(@"c:\temp\log.txt");
myTextBox.Text = text;
}
SynchronizationContext.Current renverra le contexte de synchronisation du thread d'interface utilisateur. Comment le sais-je? Au début de chaque formulaire ou application WPF, le contexte sera défini sur le thread d'interface utilisateur. Si vous créez une application WPF et exécutez mon exemple, vous verrez que lorsque vous cliquez sur le bouton, il dort pendant environ 1 seconde, puis il affichera le contenu du fichier. Vous pourriez vous attendre à ce que ce ne soit pas le cas, car l'appelant de la méthode UpdateTextBox (qui est Work1) est une méthode passée à un thread, il devrait donc dormir ce thread et non le thread d'interface utilisateur principal, NOPE! Même si la méthode Work1 est passée à un thread, notez qu'elle accepte également un objet qui est le SyncContext. Si vous le regardez, vous verrez que la méthode UpdateTextBox est exécutée via la méthode syncContext.Post et non la méthode Work1. Jetez un œil à ce qui suit:
private void Button_Click(object sender, RoutedEventArgs e)
{
Thread.Sleep(1000);
string text = File.ReadAllText(@"c:\temp\log.txt");
myTextBox.Text = text;
}
Le dernier exemple et celui-ci exécute la même chose. Les deux ne bloquent pas l'interface utilisateur pendant son exécution.
En conclusion, considérez SynchronizationContext comme un thread. Ce n'est pas un thread, il définit un thread (notez que tous les threads n'ont pas un SyncContext). Chaque fois que nous appelons la méthode Post ou Send pour mettre à jour une interface utilisateur, c'est comme mettre à jour l'interface normalement à partir du fil de discussion principal de l'interface utilisateur. Si, pour certaines raisons, vous devez mettre à jour l'interface utilisateur à partir d'un thread différent, assurez-vous que ce thread a le SyncContext du thread d'interface utilisateur principal et appelez simplement la méthode Send ou Post dessus avec la méthode que vous souhaitez exécuter et vous êtes tous ensemble.
J'espère que cela vous aide, mon pote!