SynchronizationContext fornece uma maneira de atualizar uma interface do usuário de um thread diferente (de forma síncrona pelo método Send ou de forma assíncrona pelo método Post).
Veja o seguinte exemplo:
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 retornará o contexto de sincronização do thread da interface do usuário. Como eu sei disso? No início de todos os formulários ou aplicativos WPF, o contexto será definido no thread da interface do usuário. Se você criar um aplicativo WPF e executar o meu exemplo, verá que, quando clica no botão, ele dorme por aproximadamente 1 segundo e mostra o conteúdo do arquivo. Você pode esperar que não, porque o chamador do método UpdateTextBox (que é Work1) é um método passado para um Thread; portanto, ele deve adormecer esse thread, não o thread principal da interface do usuário, NOPE! Mesmo que o método Work1 seja passado para um thread, observe que ele também aceita um objeto que é o SyncContext. Se você observar, verá que o método UpdateTextBox é executado pelo método syncContext.Post e não pelo método Work1. Veja o seguinte:
private void Button_Click(object sender, RoutedEventArgs e)
{
Thread.Sleep(1000);
string text = File.ReadAllText(@"c:\temp\log.txt");
myTextBox.Text = text;
}
O último exemplo e este executam o mesmo. Ambos não bloqueiam a interface do usuário enquanto o fazem.
Em conclusão, pense em SynchronizationContext como um encadeamento. Não é um segmento, ele define um segmento (observe que nem todos os segmentos têm um SyncContext). Sempre que chamamos o método Post ou Send para atualizar uma interface do usuário, é como atualizar a interface do usuário normalmente a partir do thread principal da interface do usuário. Se, por algum motivo, você precisar atualizar a interface do usuário a partir de um thread diferente, verifique se o thread possui o SyncContext do thread principal da interface do usuário e chame o método Send ou Post com o método que você deseja executar e pronto. conjunto.
Espero que isso ajude você, companheiro!