SynchronizationContext nos proporciona una forma de actualizar una IU desde un hilo diferente (sincrónicamente a través del método Send o asincrónicamente a través del método Post).
Eche un vistazo al siguiente ejemplo:
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 devolverá el contexto de sincronización del hilo de la interfaz de usuario. ¿Cómo se esto? Al comienzo de cada formulario o aplicación WPF, el contexto se establecerá en el hilo de la interfaz de usuario. Si crea una aplicación WPF y ejecuta mi ejemplo, verá que cuando hace clic en el botón, duerme aproximadamente 1 segundo, luego muestra el contenido del archivo. Es posible que espere que no lo haga porque la persona que llama del método UpdateTextBox (que es Work1) es un método pasado a un subproceso, por lo tanto, debe suspender ese subproceso, no el subproceso principal de la interfaz de usuario, ¡NO! Aunque el método Work1 se pasa a un subproceso, tenga en cuenta que también acepta un objeto que es el SyncContext. Si lo mira, verá que el método UpdateTextBox se ejecuta a través del método syncContext.Post y no el método Work1. Echa un vistazo a lo siguiente:
private void Button_Click(object sender, RoutedEventArgs e)
{
Thread.Sleep(1000);
string text = File.ReadAllText(@"c:\temp\log.txt");
myTextBox.Text = text;
}
El último ejemplo y este se ejecuta igual. Ambos no bloquean la interfaz de usuario mientras hace trabajos.
En conclusión, piense en SynchronizationContext como un hilo. No es un hilo, define un hilo (tenga en cuenta que no todos los hilos tienen un SyncContext). Cada vez que llamamos al método Post o Send para actualizar una interfaz de usuario, es como actualizar la interfaz de usuario normalmente desde el hilo de la interfaz de usuario principal. Si, por alguna razón, necesita actualizar la interfaz de usuario desde un subproceso diferente, asegúrese de que ese subproceso tenga el SyncContext del subproceso de la interfaz de usuario principal y simplemente llame al método Enviar o Publicar con el método que desea ejecutar y ya está conjunto.
Espero que esto te ayude, amigo!