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
Poniższy przykład kodu przedstawia użycie DoWork zdarzenia do uruchomienia operacji asynchronicznej. Ten przykład kodu jest częścią większego przykładu podanego 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 uruchamiasz 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 przerywać operację, jeśli jest true
to . W takim przypadku można ustawić flagę CancelSystem.ComponentModel.DoWorkEventArgstrue
na , a Cancelled flaga System.ComponentModel.RunWorkerCompletedEventArgs programu RunWorkerCompleted 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ę, ponieważ jest wykonywane żądanie anulowania, a pętla sondowania może przegapić CancellationPendingtrue
ustawienie . W takim przypadku flaga CancelledSystem.ComponentModel.RunWorkerCompletedEventArgs programu RunWorkerCompleted 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 powszechnym 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ądzania wątkami zarządzanymi).
Jeśli operacja generuje wynik, możesz przypisać wynik do DoWorkEventArgs.Result właściwości. Będzie to dostępne dla procedury obsługi zdarzeń RunWorkerCompleted 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 uwidoczniona jako Error właściwość System.ComponentModel.RunWorkerCompletedEventArgs. Jeśli korzystasz z debugera programu Visual Studio, debuger zostanie przerwany w DoWork momencie procedury obsługi zdarzeń, w której został zgłoszony nieobsługiwany wyjątek. Jeśli masz więcej niż jeden BackgroundWorkerelement , nie należy odwoływać się do żadnego z nich bezpośrednio, ponieważ spowoduje to połączenie DoWork procedury obsługi zdarzeń z określonym wystąpieniem BackgroundWorkerprogramu . Zamiast tego należy uzyskać dostęp, BackgroundWorker rzutując sender
parametr w DoWork procedurze 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ń.