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.
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 флагtrueSystem.ComponentModel.DoWorkEventArgs, а 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. Вместо этого необходимо получить доступ BackgroundWorker к параметру senderDoWork в обработчике событий.
Необходимо не управлять объектами пользовательского интерфейса в DoWork обработчике событий. Вместо этого общаться с пользовательским интерфейсом через BackgroundWorker события.
Дополнительные сведения об обработке событий см. в разделе "Обработка и создание событий".