Udostępnij za pośrednictwem


BackgroundWorker.DoWork Zdarzenie

Definicja

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ń.

Dotyczy

Zobacz też