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ływany.
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 dla klasy BackgroundWorker.
// 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.
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 to true. W takim przypadku można ustawić flagę CancelSystem.ComponentModel.DoWorkEventArgstruena , a Cancelled flaga System.ComponentModel.RunWorkerCompletedEventArgs w RunWorkerCompleted programie obsługi zdarzeń zostanie ustawiona na true.
Ostrzeżenie
Należy pamiętać, że kod w procedurze DoWork obsługi zdarzeń może zakończyć swoją pracę, ponieważ jest wykonywane żądanie anulowania, a pętla sondowania może nie CancellationPending być ustawiona na truewartość . W takim przypadku flaga CancelledSystem.ComponentModel.RunWorkerCompletedEventArgs programu RunWorkerCompleted obsługi zdarzeń nie zostanie ustawiona na true, 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ądzania wątkami).
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łasza 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 programu Visual Studio, debuger zostanie przerwany w DoWork punkcie 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ę bezpośrednio do żadnego z nich, ponieważ spowoduje to połączenie DoWork programu obsługi zdarzeń do określonego BackgroundWorkerwystąpienia programu . Zamiast tego należy uzyskać dostęp do BackgroundWorker elementu przez rzutowanie parametru sender w procedurze DoWork obsługi zdarzeń.
Należy zachować ostrożność, aby nie manipulować żadnymi obiektami interfejsu użytkownika w procedurze DoWork 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ń.