Поделиться через


BackgroundWorker.DoWork Событие

Определение

Возникает при вызове метода RunWorkerAsync().

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 

Тип события

Примеры

В следующем примере кода показано использование события для DoWork запуска асинхронной операции. Этот пример входит в состав более крупного примера использования класса 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.
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

Комментарии

Это событие возникает при вызове RunWorkerAsync метода . Здесь начинается операция, которая выполняет потенциально трудоемкую работу.

Код в обработчике DoWork событий должен периодически проверка CancellationPending значение свойства и прерывать операцию, если она имеет значение true. В этом случае можно задать Cancel для флага System.ComponentModel.DoWorkEventArgstrueзначение , а Cancelled флагу System.ComponentModel.RunWorkerCompletedEventArgs в RunWorkerCompleted обработчике событий будет присвоено значение true.

Внимание!

Имейте в виду, что код в обработчике DoWork событий может завершить работу при выполнении запроса на отмену, а цикл опроса может пропустить CancellationPending значение true. В этом случае Cancelled флагу System.ComponentModel.RunWorkerCompletedEventArgs в RunWorkerCompleted обработчике событий не будет присвоено значение true, даже если был сделан запрос на отмену. Эта ситуация называется состоянием гонки и является распространенной проблемой при многопотоковом программировании. Дополнительные сведения о проблемах многопоточности см. в статье Рекомендации по использованию управляемых потоков.

Если операция дает результат, его можно назначить свойству DoWorkEventArgs.Result . Это будет доступно обработчику RunWorkerCompleted событий в свойстве RunWorkerCompletedEventArgs.Result .

Если операция вызывает исключение, которое код не обрабатывает, BackgroundWorker объект перехватывает исключение и передает его в RunWorkerCompleted обработчик событий, где оно предоставляется в качестве Error свойства System.ComponentModel.RunWorkerCompletedEventArgs. Если вы работаете в отладчике Visual Studio, отладчик будет прерываться в точке DoWork обработчика событий, где было создано необработанное исключение. Если у вас несколько BackgroundWorker, не следует ссылаться ни на один из них напрямую, так как это приведет к привязке DoWork обработчика событий к конкретному экземпляру BackgroundWorker. Вместо этого необходимо получить доступ к объекту BackgroundWorkersender , приведение параметра в DoWork обработчике событий.

Необходимо соблюдать осторожность, чтобы не управлять объектами пользовательского интерфейса в DoWork обработчике событий. Вместо этого следует взаимодействовать с пользовательским интерфейсом с помощью событий BackgroundWorker.

Дополнительные сведения об обработке событий см. в разделе Обработка и создание событий.

Применяется к

См. также раздел