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 asynchrone via la méthode Post).
Regardez 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 de l'interface utilisateur. Comment puis-je le savoir ? Au début de chaque formulaire ou de chaque application WPF, le contexte est défini sur le thread UI. Si vous créez une application WPF et que vous exécutez mon exemple, vous verrez que lorsque vous cliquez sur le bouton, il dort pendant environ 1 seconde, puis il affiche le contenu du fichier. Vous pourriez vous attendre à ce qu'il ne le fasse pas parce que l'appelant de la méthode UpdateTextBox (qui est Work1) est une méthode passée à un Thread, donc il devrait dormir dans ce thread et non dans le thread principal de l'interface utilisateur, NOPE ! Même si la méthode Work1 est passée à un thread, remarquez 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 par la méthode syncContext.Post et non par la méthode Work1. Jetez un coup d'oeil à 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 s'exécutent de la même manière. Les deux ne bloquent pas l'interface utilisateur pendant qu'ils font leur travail.
En conclusion, considérez le 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 IU, c'est comme si nous mettions à jour l'IU normalement depuis le thread principal de l'IU. Si, pour une raison ou une autre, vous devez mettre à jour l'interface utilisateur à partir d'un autre thread, assurez-vous que ce thread possède le SyncContext du thread principal de l'interface utilisateur et appelez simplement la méthode Send ou Post avec la méthode que vous voulez exécuter et tout est prêt.
J'espère que ça t'aidera, mon pote !