BackgroundWorker.DoWork Zdarzenie

Definicja

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 trueto . W takim przypadku można ustawić flagę CancelSystem.ComponentModel.DoWorkEventArgstruena , 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ć CancellationPendingtrueustawienie . W takim przypadku flaga CancelledSystem.ComponentModel.RunWorkerCompletedEventArgs programu RunWorkerCompleted obsługi zdarzeń nie zostanie ustawiona na truewartość , 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ń.

Dotyczy

Zobacz też