Übersicht über die BackgroundWorker-Komponente

Aktualisiert: November 2007

Es gibt viele häufig verwendete Operationen, deren Ausführung lange dauern kann. Beispiel:

  • Bilddownloads

  • Webdienstaufrufe

  • Dateidownloads und -uploads (einschließlich für Peer-to-Peer-Anwendungen)

  • Komplexe lokale Berechnungen

  • Datenbanktransaktionen

  • Lokaler Festplattenzugriff, angesichts der langsamen Geschwindigkeit relativ zum Arbeitsspeicherzugriff

Operationen wie diese können bewirken, dass die Benutzeroberfläche während der Ausführung der Operation nicht mehr reagiert. Wenn Sie dies vermeiden möchten und bei solchen Operationen lange Verzögerungen auftreten, stellt die BackgroundWorker-Komponente eine geeignete Alternative dar.

Die BackgroundWorker-Komponente ermöglicht es Ihnen, zeitaufwändige Operationen asynchron ("im Hintergrund") auf einem anderen Thread als dem primären UI-Thread der Anwendung auszuführen. Um einen BackgroundWorker zu verwenden, müssen Sie lediglich festlegen, welche zeitaufwändige Workermethode im Hintergrund ausgeführt werden soll, und anschließend die RunWorkerAsync-Methode aufrufen. Der aufrufende Thread wird weiterhin wie gewohnt ausgeführt, während die Workermethode asynchron ausgeführt wird. Nach Abschluss der Methode gibt der BackgroundWorker eine Warnung an den aufrufenden Thread aus, indem er das RunWorkerCompleted-Ereignis auslöst, das optional die Ergebnisse der Operation enthält.

Die BackgroundWorker-Komponente ist in der Toolbox, auf der Registerkarte Komponenten verfügbar. Um dem Formular einen BackgroundWorker hinzuzufügen, ziehen Sie die BackgroundWorker-Komponente auf das Formular. Es wird im Komponentenfach angezeigt, und seine Eigenschaften werden im Eigenschaftenfenster angezeigt.

Um die asynchrone Operation zu starten, verwenden Sie die RunWorkerAsync-Methode. RunWorkerAsync verwendet einen optionalen object Parameter, mit dem Argumente an die Workermethode übergeben werden können. Die BackgroundWorker-Klasse macht das DoWork-Ereignis verfügbar, mit dem der Workerthread über einen DoWork-Ereignishandler verbunden ist.

Der DoWork-Ereignishandler verwendet einen DoWorkEventArgs-Parameter, der über eine Argument-Eigenschaft verfügt. Diese Eigenschaft empfängt den Parameter von RunWorkerAsync und kann an die Workermethode übergeben werden, die im DoWork-Ereignishandler aufgerufen wird. Im folgenden Beispiel wird gezeigt, wie ein Ergebnis von einer Workermethode mit dem Namen ComputeFibonacci zugewiesen wird. Es ist Teil eines größeren Beispiels, das Sie unter Gewusst wie: Implementieren eines Formulars, das eine Hintergrundoperation verwendet finden.

' This event handler is where the actual work is done.
Private Sub backgroundWorker1_DoWork( _
ByVal sender As Object, _
ByVal e As DoWorkEventArgs) _
Handles backgroundWorker1.DoWork

    ' Get the BackgroundWorker object that raised this event.
    Dim worker As BackgroundWorker = _
        CType(sender, BackgroundWorker)

    ' Assign the result of the computation
    ' to the Result property of the DoWorkEventArgs
    ' object. This is will be available to the 
    ' RunWorkerCompleted eventhandler.
    e.Result = ComputeFibonacci(e.Argument, worker, e)
End Sub 'backgroundWorker1_DoWork
// This event handler is where the actual,
// potentially time-consuming work is done.
private void backgroundWorker1_DoWork(object sender, 
    DoWorkEventArgs e)
{   
    // Get the BackgroundWorker that raised this event.
    BackgroundWorker worker = sender as BackgroundWorker;

    // Assign the result of the computation
    // to the Result property of the DoWorkEventArgs
    // object. This is will be available to the 
    // RunWorkerCompleted eventhandler.
    e.Result = ComputeFibonacci((int)e.Argument, worker, e);
}
// This event handler is where the actual,
// potentially time-consuming work is done.
void backgroundWorker1_DoWork( Object^ sender, DoWorkEventArgs^ e )
{
   // Get the BackgroundWorker that raised this event.
   BackgroundWorker^ worker = dynamic_cast<BackgroundWorker^>(sender);

   // Assign the result of the computation
   // to the Result property of the DoWorkEventArgs
   // object. This is will be available to the 
   // RunWorkerCompleted eventhandler.
   e->Result = ComputeFibonacci( safe_cast<Int32>(e->Argument), worker, e );
}

// This event handler is where the actual,
// potentially time-consuming work is done.
private void backgroundWorker1_DoWork(Object sender, DoWorkEventArgs e)
{
    // Get the BackgroundWorker that raised this event.
    BackgroundWorker worker = (BackgroundWorker)sender;

    // Assign the result of the computation
    // to the Result property of the DoWorkEventArgs
    // object. This is will be available to the 
    // RunWorkerCompleted eventhandler.
    e.set_Result(new Long(ComputeFibonacci(System.Convert.ToInt32
        (e.get_Argument()), worker, e)));
    //e.Result = ComputeFibonacci((int)e.Argument, worker, e); 
} //backgroundWorker1_DoWork

Weitere Informationen zur Verwendung von Ereignishandlern finden Sie unter Ereignisse und Delegaten.

Vorsicht:

Wenn Sie Multithreading verwenden, setzen Sie sich möglicherweise sehr ernsten und komplexen Problemen aus. Schlagen Sie unter Empfohlene Vorgehensweise für das verwaltete Threading nach, bevor Sie eine Projektmappe implementieren, die Multithreading verwendet.

Weitere Informationen zur Verwendung der BackgroundWorker-Klasse finden Sie unter Gewusst wie: Ausführen eines Vorgangs im Hintergrund.

Siehe auch

Aufgaben

Gewusst wie: Implementieren eines Formulars, das eine Hintergrundoperation verwendet

Weitere Ressourcen

Multithreading in Visual Basic