Freigeben über


BackgroundWorker-Komponentenübersicht

Es gibt viele häufig ausgeführte Operationen, die viel Zeit für die Ausführung benötigen können. Beispiel:

  • Herunterladen von Bildern

  • Webdienstaufrufe

  • Dateidownloads 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 BackgroundWorker zu 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 läuft normal weiter, während die Arbeitsmethode asynchron ausgeführt wird. Nachdem die Methode abgeschlossen ist, wird der aufrufende Thread benachrichtigt, indem das BackgroundWorker-Ereignis ausgelöst wird, das optional die Ergebnisse des Vorgangs enthalten kann.

Die BackgroundWorker Komponente ist über die Toolbox auf der Registerkarte "Komponenten " verfügbar. Wenn Sie dem Formular ein BackgroundWorker Element hinzufügen möchten, ziehen Sie die BackgroundWorker Komponente auf das Formular. Sie wird im Komponentenbereich angezeigt, und die zugehörigen Eigenschaften werden im Eigenschaftenfenster angezeigt.

Verwenden Sie die RunWorkerAsync Methode, um den asynchronen Vorgang zu starten. RunWorkerAsync kann einen optionalen object Parameter verwenden, der zum Übergeben von Argumenten an Ihre Worker-Methode genutzt werden kann. Die BackgroundWorker Klasse macht das DoWork Ereignis verfügbar, an das ihr Workerthread über einen DoWork Ereignishandler angefügt wird.

Der DoWork Ereignishandler verwendet einen DoWorkEventArgs Parameter, der über eine Argument Eigenschaft verfügt. Diese Eigenschaft erhält den Parameter von RunWorkerAsync und kann an Ihre Arbeitsmethode übergeben werden, die im DoWork Ereignishandler aufgerufen wird. Das folgende Beispiel zeigt, wie Sie ein Ergebnis aus einer Workermethode zuweisen, die aufgerufen wird ComputeFibonacci. Es ist Teil eines größeren Beispiels, das Sie unter How to: Implement a Form That Uses a Background Operation 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 How to: Run an Operation in the Background.

Siehe auch