BackgroundWorker.DoWork Zdarzenie
Definicja
Ważne
Niektóre informacje odnoszą się do produktu w wersji wstępnej, który może zostać znacząco zmodyfikowany przed wydaniem. Firma Microsoft nie udziela żadnych gwarancji, jawnych lub domniemanych, w odniesieniu do informacji podanych w tym miejscu.
Występuje, gdy RunWorkerAsync() jest wywoływana.
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
Typ zdarzenia
Przykłady
W poniższym przykładzie kodu pokazano użycie DoWork zdarzenia do rozpoczęcia operacji asynchronicznej. Ten przykład kodu jest częścią większego przykładu udostępnionego BackgroundWorker dla klasy .
// 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
Uwagi
To zdarzenie jest wywoływane podczas wywoływania RunWorkerAsync metody . W tym miejscu rozpoczynasz operację, która wykonuje potencjalnie czasochłonną pracę.
Kod w procedurze obsługi zdarzeń DoWork powinien okresowo sprawdzać CancellationPending wartość właściwości i przerwać operację, jeśli jest true
to . W takim przypadku można ustawić flagę Cancel System.ComponentModel.DoWorkEventArgs true
na , a Cancelled flaga System.ComponentModel.RunWorkerCompletedEventArgs w RunWorkerCompleted programie obsługi zdarzeń zostanie ustawiona na true
.
Przestroga
Należy pamiętać, że kod w procedurze DoWork obsługi zdarzeń może zakończyć pracę w trakcie żądania anulowania, a pętla sondowania może przegapić CancellationPending true
ustawienie . W takim przypadku flaga Cancelled System.ComponentModel.RunWorkerCompletedEventArgs elementu w RunWorkerCompleted programie obsługi zdarzeń nie zostanie ustawiona na true
wartość , mimo że zostało wykonane żądanie anulowania. Ta sytuacja jest nazywana warunkiem wyścigu i jest częstym problemem w programowaniu wielowątkowym. Aby uzyskać więcej informacji na temat problemów z projektowaniem wielowątkowym, zobacz Managed Threading Best Practices (Najlepsze rozwiązania dotyczące zarządzanych wątków).
Jeśli operacja generuje wynik, możesz przypisać wynik do DoWorkEventArgs.Result właściwości . Będzie to dostępne dla RunWorkerCompleted programu obsługi zdarzeń we RunWorkerCompletedEventArgs.Result właściwości .
Jeśli operacja zgłosi wyjątek, którego kod nie obsługuje, BackgroundWorker przechwytuje wyjątek i przekazuje go do RunWorkerCompleted procedury obsługi zdarzeń, gdzie jest uwidoczniony jako Error właściwość System.ComponentModel.RunWorkerCompletedEventArgs. Jeśli korzystasz z debugera Visual Studio, debuger zostanie przerwany w punkcie obsługi zdarzeń, w DoWork którym został zgłoszony nieobsługiwany wyjątek. Jeśli masz więcej niż jeden BackgroundWorkerelement , nie należy odwoływać się bezpośrednio do żadnego z nich, ponieważ łączy DoWork to program obsługi zdarzeń z określonym wystąpieniem BackgroundWorkerprogramu . Zamiast tego należy uzyskać dostęp do pliku BackgroundWorker przez rzutowanie parametru sender
w procedurze DoWork obsługi zdarzeń.
Należy zachować ostrożność, aby nie manipulować żadnymi obiektami interfejsu użytkownika w DoWork programie obsługi zdarzeń. Zamiast tego komunikują się z interfejsem użytkownika za pośrednictwem zdarzeń BackgroundWorker .
Aby uzyskać więcej informacji na temat obsługi zdarzeń, zobacz Obsługa i podnoszenie zdarzeń.