Creo que necesito algunas precisiones respecto WPFs Dispatcher.Invoke y Dispatcher.BeginInvoke uso.WPF Dispatcher.BeginInvoke y UI/Antecedentes Temas
Supongamos que tengo un poco de 'trabajo' código de larga duración como tal que se invoca en la prensa de un botón en una sencilla aplicación de WPF:
longWorkTextBox.Text = "Ready For Work!";
Action workAction = delegate
{
Console.WriteLine("Starting Work Action");
int i = int.MaxValue;
while (i > 0)
i--;
Console.WriteLine("Ending Work Action");
longWorkTextBox.Text = "Work Complete";
};
longWorkTextBox.Dispatcher.BeginInvoke(DispatcherPriority.Background, workAction);
Este código se bloquea mi interfaz de usuario, mientras que el workAction se está realizando. Esto se debe a que las invocaciones de Dispatcher siempre se ejecutan en el hilo de la interfaz de usuario, ¿verdad?
Suponiendo esto, Cuál es la mejor práctica para la configuración de mi despachador para ejecutar el workAction en un hilo separado de mi interfaz de usuario? Sé que puedo añadir un BackgroundWorker a mi workAction para evitar que mi interfaz de usuario de bloqueo como tal:
longWorkTextBox.Text = "Ready For Work!";
Action workAction = delegate
{
BackgroundWorker worker = new BackgroundWorker();
worker.DoWork += delegate
{
Console.WriteLine("Starting Slow Work");
int i = int.MaxValue;
while (i > 0)
i--;
Console.WriteLine("Ending Work Action");
};
worker.RunWorkerCompleted += delegate
{
longWorkTextBox.Text = "Work Complete";
};
worker.RunWorkerAsync();
};
longWorkTextBox.Dispatcher.BeginInvoke(DispatcherPriority.Background, workAction);
¿Hay alguna forma más elegante de hacer esto, además de utilizar el BackgroundWorker? Siempre he escuchado que el BackgroundWorker es peculiar, por lo que tengo curiosidad por conocer algunas alternativas.
Sip. Si desea hacer algo en un hilo de fondo, pero afecta el hilo de la interfaz de usuario cuando haya terminado, BackgroundWorker es bastante fácil de usar. –
En 2013 hay una manera más simple - async/await: http://stackoverflow.com/questions/12654968/is-async-and-await-exclusively-for-gui-based-asynchronous-programming – Cosmin
Me gusta mucho async, pero no funciona bien con todo. ¡Pero es una opción bastante buena! – Malavos