ACTUALIZACIÓN
Si está usando C# 5 y .NET 4.5 o superior se puede evitar que el otro hilo en el primer lugar usando async
y await
, por ejemplo:
private async Task<string> SimLongRunningProcessAsync()
{
await Task.Delay(2000);
return "Success";
}
private void Button_Click(object sender, RoutedEventArgs e)
{
button.Content = "Running...";
var result = await SimLongRunningProcessAsync();
button.Content = result;
}
Fácil:
Dispatcher.BeginInvoke(new Action(delegate()
{
myListBox.Items.Add("new item"));
}));
Si está en el código subyacente. De lo contrario se puede acceder al despachador (que está en cada UIElement
) usando:
Application.Current.MainWindow.Dispatcher.BeginInvoke(...
Ok eso es mucho en una línea que me deje ir sobre ella:
Cuando desee actualizar un control de interfaz de usuario que, como se el mensaje dice, tiene que hacerlo desde el hilo de UI. Está construido para pasar un delegado (un método) al subproceso de UI: Dispatcher
. Una vez que tenga el Dispatcher
, puede Invoke()
de BeginInvoke()
pasando un delegado para que se ejecute en el subproceso de la interfaz de usuario. La única diferencia es Invoke()
solo se devolverá una vez que se haya ejecutado el delegado (es deciren su caso, se ha agregado el nuevo elemento de ListBox), mientras que BeginInvoke()
regresará inmediatamente para que el otro subproceso desde el que está llamando pueda continuar (el Dispatcher ejecutará su delegado lo antes posible, lo que probablemente sea inmediato).
me pasó un delegado anónimo anterior:
delegate() {myListBox.Items.Add("new item");}
zona entre el {} es el bloque de método. Esto se llama anónimo porque solo se crea uno y no tiene un nombre (generalmente se puede hacer esto usando una expresión lambda pero en este caso C# no puede resolver el método BeginInvoke() para llamar). O que podría haber una instancia de un delegado:
Action myDelegate = new Action(UpdateListMethod);
void UpdateListMethod()
{
myListBox.Items.Add("new item");
}
entonces pasó lo siguiente:
Dispatcher.Invoke(myDelegate);
que también se utiliza la clase de acción que está construido en un delegado, pero que podría haber creado su propia - se puede leer más sobre los delegados en MSDN ya que esto va un poco fuera de tema ...
Tengo demasiado sueño para escribir una respuesta completa, pero aquí hay una pista: mire (Google, SO o MSDN) para Dispatcher. Ahora, me voy a la cama. –