BackgroundWorker.DoWork Ereignis
Definition
Wichtig
Einige Informationen beziehen sich auf Vorabversionen, die vor dem Release ggf. grundlegend überarbeitet werden. Microsoft übernimmt hinsichtlich der hier bereitgestellten Informationen keine Gewährleistungen, seien sie ausdrücklich oder konkludent.
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
Im folgenden Codebeispiel wird die Verwendung des DoWork -Ereignisses zum Starten eines asynchronen Vorgangs veranschaulicht. 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 zeitaufwändige Arbeit ausführt.
Der Code im DoWork Ereignishandler sollte in regelmäßigen Abständen den CancellationPending Eigenschaftswert überprüfen und den Vorgang abbrechen, wenn er ist true
. In diesem Fall können Sie das Cancel Flag von System.ComponentModel.DoWorkEventArgs auf true
festlegen, und das Cancelled Flag von System.ComponentModel.RunWorkerCompletedEventArgs in Ihrem RunWorkerCompleted Ereignishandler wird auf true
festgelegt.
Achtung
Beachten Sie, dass Ihr Code im DoWork Ereignishandler möglicherweise seine Arbeit beendet, wenn eine Abbruchanforderung ausgeführt wird, und ihre Abrufschleife möglicherweise nicht CancellationPending auf true
festgelegt wird. In diesem Fall wird das Cancelled Flag von System.ComponentModel.RunWorkerCompletedEventArgs in Ihrem RunWorkerCompleted Ereignishandler nicht auf true
festgelegt, auch wenn eine Abbruchanforderung gestellt wurde. Diese Situation wird als Racebedingung bezeichnet und ist ein häufiges Anliegen in der Multithreadprogrammierung. Weitere Informationen zu Problemen mit dem Multithreading-Entwurf finden Sie unter Bewährte Methoden für verwaltetes Threading.
Wenn der Vorgang ein Ergebnis erzeugt, können Sie das Ergebnis der DoWorkEventArgs.Result -Eigenschaft zuweisen. Dies ist für den RunWorkerCompleted Ereignishandler in der RunWorkerCompletedEventArgs.Result -Eigenschaft verfügbar.
Wenn der Vorgang eine Ausnahme auslöst, die ihr Code nicht behandelt, 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 dem DoWork 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 auf ihre BackgroundWorker zugreifen, 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.