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.
Дополнительные сведения об обработке событий см. в разделе Обработка и создание событий.