2010-03-22 19 views
7

Tengo una tarea que lleva mucho tiempo ejecutar. Con el fin de informar al usuario del progreso, tengo una barra de progreso que actualizo dentro de DoWork.WPF El mejor punto para actualizar una barra de progreso de BackgroundWorker

¿Alguien me puede decir si esta es la mejor manera de actualizar la barra de progreso ? He oído que hay un controlador de eventos ReportProgress, pero estoy confundido porque no estoy seguro del propósito de ReportProgress.

Respuesta

0

ReportProgress es lo que usaría para actualizar el progreso de su tarea, incluyendo cosas como la interfaz de usuario, en su caso, una barra de progreso.

Debe consultar los documentos de MSDN, ubicados en here.

básicamente, se crea un controlador para el evento ReportProgress, a continuación, en su DoWorkEventHandler, se llama a la ReportProgress así:

worker.ReportProgress((i * 10)); 
+0

Ok! gracias, así que puedo llamar a ReportProgress y se generará un evento ProgressChanged como dice Maurizio. Luego dentro del evento progressChanged puedo actualizar cualquier control de mi UI que quiera, por ejemplo, barra de progreso, etiqueta, bloque de texto, ... sin necesidad de llamar a Dispatcher.Invoke. ¿Estoy en lo cierto? Gracias. – toni

+0

¡eso es correcto! –

0

El evento ProgressChanged es lo que busca. Sin embargo, asegúrese de crear el BackgroundWorker como se muestra a continuación, de modo que este evento aparezca cuando se llame a ReportProgress.

BackgroundWorker bw = new BackgroundWorker() { WorkerReportsProgress = true }; 
bw.ProgressChanged += ... ; 
10

Dado que el trabajador de segundo plano trabaja en un hilo separado, se encontrará con problemas si intenta acceder a los objetos de la interfaz de usuario. Llamar al método ReportProgress en el trabajador desde dentro del controlador DoWork provoca el evento ProgressChanged. Ese evento debe manejarse en el hilo de UI para acceder fácilmente al control.

 BackgroundWorker worker = new BackgroundWorker(); 
     worker.DoWork += DoWorkHandler; 
     worker.WorkerReportsProgress = true; 
     worker.ProgressChanged += (s, e) => 
      { myProgressBar.Value = e.ProgressPercentage; }; 

     worker.RunWorkerAsync(); 

...

public void DoWorkHandler(object sender, DoWorkEventArgs e) 
    { 
     BackgroundWorker worker = sender as BackgroundWorker; 

     while (working) 
     { 
      // Do Stuff 

      worker.ReportProgress(progressPercentage); 
     } 
    } 
Cuestiones relacionadas