2010-03-22 2 views
7

Ho un'attività che richiede molto tempo per essere eseguita. Per informare l'utente dell'avanzamento, ho una barra di progresso che aggiorno all'interno di DoWork.WPF Il punto migliore per aggiornare una barra di avanzamento da BackgroundWorker

Qualcuno può dirmi se questo è il modo migliore per aggiornare la barra di progresso ? Ho sentito che esiste un gestore di eventi ReportProgress ma sono confuso perché non sono sicuro dello scopo di ReportProgress.

risposta

0

ReportProgress è ciò che si desidera utilizzare per aggiornare l'avanzamento dell'attività, comprese le cose come l'interfaccia utente - nel tuo caso, una barra di avvio.

Si consiglia di controllare i documenti MSDN, che si trova here.

fondamentalmente, si crea un gestore per l'evento ReportProgress, quindi nel vostro DoWorkEventHandler, si chiama il ReportProgress in questo modo:

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

Ok! grazie, quindi posso chiamare ReportProgress e aumenterà l'evento ProgressChanged come dice Maurizio. Quindi, all'interno dell'evento progressChanged posso aggiornare qualsiasi controllo della mia interfaccia utente che voglio, ad esempio, barra di avanzamento, etichetta, blocco di testo, ... senza bisogno di chiamare Dispatcher.Invoke. Ho ragione? Grazie. – toni

+0

corretto! –

0

L'evento ProgressChanged è quello che state cercando. Tuttavia, assicurati di creare il BackgroundWorker come di seguito, in modo che sollevi questo evento quando viene chiamato ReportProgress.

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

Poiché l'operatore in background lavora in un thread separato, si incontrano problemi se si tenta di accedere agli oggetti dell'interfaccia utente. Chiamando il metodo ReportProgress sul worker dall'interno del gestore DoWork viene generato l'evento ProgressChanged. Tale evento dovrebbe essere gestito nel thread dell'interfaccia utente in modo da accedere facilmente al controllo.

 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); 
     } 
    }