BackgroundWorker.DoWork Ereignis

Definition

Tritt ein, wenn RunWorkerAsync() aufgerufen wird.

public:
 event System::ComponentModel::DoWorkEventHandler ^ DoWork;
public event System.ComponentModel.DoWorkEventHandler DoWork;
public event System.ComponentModel.DoWorkEventHandler? DoWork;
member this.DoWork : System.ComponentModel.DoWorkEventHandler 
Public Custom Event DoWork As DoWorkEventHandler 

Ereignistyp

Beispiele

Das folgende Codebeispiel veranschaulicht die Verwendung des Ereignisses DoWork zum Starten eines asynchronen Vorgangs. Dieses Codebeispiel ist Teil eines größeren Beispiels, das für die BackgroundWorker-Klasse bereitgestellt wird.

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

Hinweise

Dieses Ereignis wird ausgelöst, wenn Sie die RunWorkerAsync -Methode aufrufen. Hier starten Sie den Vorgang, der die potenziell zeitaufwendige Arbeit ausführt.

Ihr Code im DoWork Ereignishandler sollte in regelmäßigen Abständen den CancellationPending Eigenschaftswert überprüfen und den Vorgang abbrechen, wenn er lautet true. In diesem Fall können Sie das Cancel Flag von System.ComponentModel.DoWorkEventArgs auf truefestlegen, und das Cancelled Flag von System.ComponentModel.RunWorkerCompletedEventArgs in Ihrem RunWorkerCompleted Ereignishandler wird auf truefestgelegt.

Achtung

Beachten Sie, dass Ihr Code im DoWork Ereignishandler möglicherweise seine Arbeit beendet, wenn eine Abbruchanforderung gestellt wird, und ihre Abfrageschleife möglicherweise nicht CancellationPending auf truefestgelegt wird. In diesem Fall wird das Cancelled Flag von System.ComponentModel.RunWorkerCompletedEventArgs in Ihrem RunWorkerCompleted Ereignishandler nicht auf truefestgelegt, obwohl eine Abbruchanforderung gestellt wurde. Diese Situation wird als Racebedingung bezeichnet und ist ein häufiges Problem bei der Multithreadprogrammierung. Weitere Informationen zu Multithreadingentwurfsproblemen finden Sie unter Best Practices für verwaltetes Threading.

Wenn ihr Vorgang ein Ergebnis erzeugt, können Sie das Ergebnis der DoWorkEventArgs.Result -Eigenschaft zuweisen. Dies steht dem RunWorkerCompleted Ereignishandler in der RunWorkerCompletedEventArgs.Result -Eigenschaft zur Verfügung.

Wenn der Vorgang eine Ausnahme auslöst, die ihr Code nicht verarbeitet, fängt die BackgroundWorker Ausnahme ab und übergibt sie an den RunWorkerCompleted Ereignishandler, wo sie als Error Eigenschaft von System.ComponentModel.RunWorkerCompletedEventArgsverfügbar gemacht wird. Wenn Sie unter dem Visual Studio-Debugger ausführen, wird der Debugger an dem Punkt im Ereignishandler unterbrochen, an DoWork dem die nicht behandelte Ausnahme ausgelöst wurde. Wenn Sie über mehrere BackgroundWorkerverfügen, sollten Sie nicht direkt auf einen dieser Elemente verweisen, da Der DoWork Ereignishandler dadurch an eine bestimmte instance von BackgroundWorkergekoppelt würde. Stattdessen sollten Sie darauf zugreifen BackgroundWorker , indem Sie den sender Parameter in Ihren DoWork Ereignishandler umwandeln.

Sie müssen darauf achten, keine Benutzeroberflächenobjekte in Ihrem DoWork Ereignishandler zu bearbeiten. Kommunizieren Sie stattdessen über BackgroundWorker-Ereignisse mit der Benutzeroberfläche.

Weitere Informationen zum Behandeln von Ereignissen finden Sie unter behandeln und Auslösen von Ereignissen.

Gilt für:

Weitere Informationen