2013-11-01 16 views
5

Tutti, conoscevo già l'utilizzo di base dello BackgroundWorker per gestire più casi di thread in WinForm. E la struttura del codice appare come sotto.Come utilizzare l'evento BackgroundWorker RunWorkerCompleted

Nel thread di applicazione principale. avvia semplicemente BackgroundWork.

if (backgroundWorker1.IsBusy != true) 
    { 
     // Start the asynchronous operation. 
     backgroundWorker1.RunWorkerAsync(); 
    } 

Quindi si genera l'evento DoWork. Quindi possiamo fare qualcosa lì dentro.

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) 
{ 
    BackgroundWorker worker = sender as BackgroundWorker; 
    ...... 
    // report progress. 
    worker.ReportProgress(iProgress); 
    .... 
} 

Poi abbiamo solo bisogno di gestire l'evento ProgressChanged per mostrare lo stato di avanzamento BackgroundWorker.

private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e) 
{ 
    //show progress. 
    resultLabel.Text = (e.ProgressPercentage.ToString() + "%"); 
} 

Dopo DoWork finito o qualche eccezione è accaduto. l'evento RunWorkerCompleted verrebbe licenziato.

Here Comes My domande per questo eventi gestiscono. per favore aiutatemi a rivederli. Grazie.

Ho notato che c'è una proprietà denominata "Risultato" nel RunWorkerCompletedEventArgs e, A cosa serve? Come posso usarlo?

C'è qualche possibilità di ricevere il mio messaggio di eccezione personalizzato invece il e.error? Se c'è, come si fa?

private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
{ 
    if (e.Cancelled == true) 
    { 
     resultLabel.Text = "Canceled!"; 
    } 
    else if (e.Error != null) 
    { 
     resultLabel.Text = "Error: " + e.Error.Message; 
    } 
    else 
    { 
     resultLabel.Text = e.Result.ToString(); 
    } 
} 

risposta

13

La proprietà Result nel RunWorkerCompletedEventArgs è il valore che avete assegnato alla proprietà Risultato di DoWorkEventHandler in DoWork().

È possibile assegnare qualcosa che ti piace di questo, così si potrebbe restituire un intero, una stringa, un/tipo composito oggetto, ecc

Se viene generata un'eccezione in DoWork() allora si può accedere l'eccezione nel Error proprietà di RunWorkerCompletedEventArgs. In questa situazione, l'accesso alla proprietà Result causerà il lancio di TargetInvocationException.

+0

Che dire 'Error'? questo è anche ciò che l'OP chiedeva. –

+1

Risposta aggiornata. Grazie. (Lettura sul telefono e mancata) – SimonGoldstone

0

È possibile utilizzare la proprietà Result per memorizzare i risultati da DoWork e accedervi dall'evento Completed. Ma se il processo di background worker è stato cancellato o è stata sollevata un'eccezione, il risultato non sarà accessibile. Troverete maggiori dettagli here.

5
public class MyWorkerClass 
{ 
    private string _errorMessage = ""; 
    public string ErrorMessage { get { return _errorMessage; } set { _errorMessage = value; }} 

    public void RunStuff(object sender, DoWorkEventArgs e) 
    { 
     //... put some code here and fill ErrorMessage whenever you want 
    } 
} 

allora la classe in cui lo si utilizza

public class MyClassUsingWorker 
{ 
    // have reference to the class where the worker will be running 
    private MyWorkerClass mwc = null; 

    // run the worker 
    public void RunMyWorker() 
    { 
     mwc = new MyWorkerClass(); 
     BackgroundWorker backgroundWorker1 = new BackgroundWorker(); 
     backgroundWorker1.DoWork += new DoWorkEventHandler(mwc.RunStuff); 
     backgroundWorker1.RunWorkerCompleted += new RunWorkerCompletedEventHandler(backgroundWorker1_RunWorkerCompleted); 
     backgroundWorker1.RunWorkerAsync(); 
    } 

    private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
    { 
     string strSpecialMessage = mwc.ErrorMessage; 

     if (e.Cancelled == true) 
     { 
      resultLabel.Text = "Canceled!"; 
     } 
     else if (e.Error != null) 
     { 
      resultLabel.Text = "Error: " + e.Error.Message; 
     } 
     else 
     { 
      resultLabel.Text = e.Result.ToString(); 
     } 
    } 
}