Übersicht über die BackgroundWorker-Komponente

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

Vorgänge wie diese können bewirken, dass die Benutzeroberfläche während ihrer Ausführung 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 BackgroundWorker zu Ihrem Formular hinzuzufügen, ziehen Sie die BackgroundWorker-Komponente auf Ihr Formular. Es wird auf der Komponentenleiste 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 Vorgehensweise: Implementieren eines Formulars, das einen Hintergrundvorgang verwendet finden.

// 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 = 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 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

Weitere Informationen zur Verwendung von Ereignishandlern finden Sie unter Ereignisse.

Achtung

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

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

Weitere Informationen