En mi aplicación, necesito realizar una serie de pasos de inicialización, estos tardan entre 7 y 8 segundos en completarse, durante los cuales mi IU deja de responder. Para resolver esto, realizo la inicialización en un hilo separado:
public void Initialization()
{
Thread initThread = new Thread(new ThreadStart(InitializationThread));
initThread.Start();
}
public void InitializationThread()
{
outputMessage("Initializing...");
//DO INITIALIZATION
outputMessage("Initialization Complete");
}
He leído algunos artículos sobre BackgroundWorker
y cómo debería permitirme mantener mi aplicación receptiva sin tener que escribir un hilo para realizar tareas largas, pero no he tenido éxito tratando de implementarlo, ¿alguien podría decir cómo lo haría? esto usando el BackgroundWorker
?
c#
wpf
multithreading
backgroundworker
Eamonn McEvoy
fuente
fuente
Respuestas:
Seguimiento del progreso (opcional, pero a menudo útil)
a) suscribirse al
ProgressChanged
evento y usarReportProgress(Int32)
enDoWork
b) conjunto
worker.WorkerReportsProgress = true;
(créditos a @zagy)fuente
Es posible que desee considerar el uso en
Task
lugar de los trabajadores en segundo plano.La forma más fácil de hacerlo es en su ejemplo es
Task.Run(InitializationThread);
.Existen varios beneficios al usar tareas en lugar de trabajadores en segundo plano. Por ejemplo, las nuevas funciones async / await en .net 4.5 se usan
Task
para subprocesos. Aquí hay alguna documentación sobreTask
https://docs.microsoft.com/en-us/dotnet/api/system.threading.tasks.taskfuente
BackgroundWorker
. Con la esperanza de dirigir a la gente a eso.async
yawait
. Estas son formas integradas en el lenguaje para usar las tareas de una manera mucho más legible.Además, consulte el siguiente enlace para comprender los conceptos de
Background
:http://www.c-sharpcorner.com/UploadFile/1c8574/threads-in-wpf/
fuente
Encontré esto ( WPF Multithreading: Using the BackgroundWorker e Reporting the Progress to the UI. Link ) para contener el resto de los detalles que faltan en la respuesta de @ Andrew.
Lo único que encontré muy útil fue que el hilo de trabajo no podía acceder a los controles de MainWindow (en su propio método), sin embargo, al usar un delegado dentro del controlador de eventos de Windows principal, era posible.
fuente