2013-11-01 14 views
5

Alles, ich kannte bereits die grundlegende Verwendung der BackgroundWorker um mehrere Thread-Fall in der WinForm zu behandeln. Und die Codestruktur sieht wie folgt aus.Wie verwendet man das BackgroundWorker-Ereignis RunWorkerCompleted

Im Hauptthread der Anwendung. starte einfach den BackgroundWork.

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

Dann würde das Ereignis DoWork ausgelöst werden. Wir können also etwas tun.

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

Dann brauchen wir nur das ProgressChanged Ereignis zu behandeln, den Background Fortschritt zu zeigen.

Nach DoWork fertig oder eine Ausnahme passiert ist. das Ereignis RunWorkerCompleted würde ausgelöst werden.

Hier kommt meine Fragen zu diesem Ereignis behandeln. Bitte helfen Sie sie zu überprüfen. Vielen Dank.

Ich bemerkte, dass es eine Eigenschaft mit dem Namen 'Ergebnis' in der RunWorkerCompletedEventArgs e, Wofür verwendet es? Wie kann ich es benutzen?

Gibt es eine Möglichkeit, meine benutzerdefinierte Ausnahmebedingungsnachricht anstelle der e.error zu erhalten? Wenn es gibt, wie man es macht?

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

Antwort

13

Die Result Eigenschaft in RunWorkerCompletedEventArgs ist der Wert, den Sie dem Ergebnis Eigenschaft DoWorkEventHandler in DoWork() zugeordnet haben.

Sie können alles, was Sie dieses mögen, zuweisen, so dass Sie eine ganze Zahl zurückgeben könnte, eine Zeichenfolge, ein Objekt/Verbundtyp usw.

Wenn eine Ausnahme in DoWork() geworfen wird, dann können Sie die Ausnahme in der Zugriff Error Eigentum von RunWorkerCompletedEventArgs. In diesem Fall wird beim Zugriff auf die Ergebniseigenschaft ein TargetInvocationException ausgelöst.

+0

Was ist 'Error'? Das hat auch das OP gefordert. –

+1

Aktualisierte Antwort. Vielen Dank. (Lesen am Telefon und verpasste es) – SimonGoldstone

0

Sie können die Result-Eigenschaft verwenden, um Ergebnisse aus dem DoWork zu speichern und auf das Ereignis Completed zuzugreifen. Wenn jedoch der Hintergrund-Worker-Prozess abgebrochen wurde oder eine Ausnahme ausgelöst wurde, kann auf das Ergebnis nicht zugegriffen werden. Sie finden weitere Details 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 
    } 
} 

dann die Klasse, wo Sie es verwenden

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(); 
     } 
    } 
} 
Verwandte Themen