Freigeben über


BackgroundWorker-Komponentenübersicht

Es gibt viele häufig ausgeführte Vorgänge, die lange Zeit in Anspruch nehmen können. Zum Beispiel:

  • Bilddownloads

  • Webdienstaufrufe

  • Datei-Downloads und -Uploads (einschließlich Peer-to-Peer-Anwendungen)

  • Komplexe lokale Berechnungen

  • Datenbanktransaktionen

  • Zugriff auf den lokalen Datenträger aufgrund der langsamen Geschwindigkeit im Verhältnis zum Arbeitsspeicherzugriff

Vorgänge wie diese können dazu führen, dass Ihre Benutzeroberfläche blockiert wird, während sie ausgeführt werden. Wenn Sie eine reaktionsfähige Benutzeroberfläche benötigen und mit langen Verzögerungen im Zusammenhang mit solchen Vorgängen konfrontiert sind, bietet die BackgroundWorker Komponente eine bequeme Lösung.

Die BackgroundWorker Komponente bietet Ihnen die Möglichkeit, zeitaufwendige Vorgänge asynchron ("im Hintergrund") in einem Thread auszuführen, der sich vom Haupt-UI-Thread Ihrer Anwendung unterscheidet. Um eine BackgroundWorkerzu verwenden, teilen Sie ihm einfach mit, welche zeitaufwendige Arbeitsmethode im Hintergrund ausgeführt werden soll, und rufen dann die RunWorkerAsync-Methode auf. Der aufrufende Thread wird weiterhin normal ausgeführt, während die Arbeitermethode asynchron ausgeführt wird. Wenn die Methode abgeschlossen ist, benachrichtigt die BackgroundWorker den aufrufenden Thread, indem das RunWorkerCompleted-Ereignis ausgelöst wird, das optional die Ergebnisse des Vorgangs enthält.

Die BackgroundWorker Komponente ist über die Toolbox-auf der Registerkarte Komponenten verfügbar. Wenn Sie ihrem Formular eine BackgroundWorker hinzufügen möchten, ziehen Sie die BackgroundWorker Komponente auf das Formular. Sie wird in der Komponentenleiste angezeigt, und ihre Eigenschaften werden im Fenster Eigenschaften angezeigt.

Verwenden Sie zum Starten des asynchronen Vorgangs die RunWorkerAsync-Methode. RunWorkerAsync verwendet einen optionalen object-Parameter, um Argumente an die Worker-Methode zu übergeben. Die BackgroundWorker-Klasse stellt das DoWork-Ereignis bereit, an das Ihr Arbeitsthread über einen DoWork-Ereignishandler angefügt wird.

Der DoWork-Ereignishandler akzeptiert einen DoWorkEventArgs Parameter, der über eine Argument-Eigenschaft verfügt. Diese Eigenschaft empfängt den Parameter von RunWorkerAsync und kann an Ihre Arbeitsroutine übergeben werden, die im DoWork-Ereignishandler aufgerufen wird. Das folgende Beispiel zeigt, wie Sie ein Ergebnis aus einer Worker-Methode namens ComputeFibonaccizuweisen. Es ist Teil eines größeren Beispiels, das Sie unter "Wie man ein Formular implementiert, das eine Hintergrundoperation 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.

Vorsicht

Wenn Sie Multithreading jeglicher Art verwenden, machen Sie sich potenziell sehr schwerwiegenden und komplexen Fehlern aus. Lesen Sie die Best Practices für verwaltetes Threading, bevor Sie eine Lösung implementieren, die Multithreading verwendet.

Weitere Informationen zur Verwendung der BackgroundWorker-Klasse finden Sie unter "So führen Sie einen Vorgang im Hintergrund aus".

Siehe auch