BackgroundWorker.RunWorkerCompleted Событие
Определение
Важно!
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Возникает, когда выполнение фоновой операции завершено, отменено или вызвало исключение.
public:
event System::ComponentModel::RunWorkerCompletedEventHandler ^ RunWorkerCompleted;
public event System.ComponentModel.RunWorkerCompletedEventHandler RunWorkerCompleted;
public event System.ComponentModel.RunWorkerCompletedEventHandler? RunWorkerCompleted;
member this.RunWorkerCompleted : System.ComponentModel.RunWorkerCompletedEventHandler
Public Custom Event RunWorkerCompleted As RunWorkerCompletedEventHandler
Тип события
Примеры
В следующем примере кода показано использование RunWorkerCompleted события для обработки результата асинхронной операции. Этот пример входит в состав более крупного примера использования класса BackgroundWorker.
// This event handler deals with the results of the
// background operation.
void backgroundWorker1_RunWorkerCompleted( Object^ /*sender*/, RunWorkerCompletedEventArgs^ e )
{
// First, handle the case where an exception was thrown.
if ( e->Error != nullptr )
{
MessageBox::Show( e->Error->Message );
}
else
if ( e->Cancelled )
{
// Next, handle the case where the user cancelled
// the operation.
// Note that due to a race condition in
// the DoWork event handler, the Cancelled
// flag may not have been set, even though
// CancelAsync was called.
resultLabel->Text = "Cancelled";
}
else
{
// Finally, handle the case where the operation
// succeeded.
resultLabel->Text = e->Result->ToString();
}
// Enable the UpDown control.
this->numericUpDown1->Enabled = true;
// Enable the Start button.
startAsyncButton->Enabled = true;
// Disable the Cancel button.
cancelAsyncButton->Enabled = false;
}
// This event handler deals with the results of the
// background operation.
private void backgroundWorker1_RunWorkerCompleted(
object sender, RunWorkerCompletedEventArgs e)
{
// First, handle the case where an exception was thrown.
if (e.Error != null)
{
MessageBox.Show(e.Error.Message);
}
else if (e.Cancelled)
{
// Next, handle the case where the user canceled
// the operation.
// Note that due to a race condition in
// the DoWork event handler, the Cancelled
// flag may not have been set, even though
// CancelAsync was called.
resultLabel.Text = "Canceled";
}
else
{
// Finally, handle the case where the operation
// succeeded.
resultLabel.Text = e.Result.ToString();
}
// Enable the UpDown control.
this.numericUpDown1.Enabled = true;
// Enable the Start button.
startAsyncButton.Enabled = true;
// Disable the Cancel button.
cancelAsyncButton.Enabled = false;
}
' This event handler deals with the results of the
' background operation.
Private Sub backgroundWorker1_RunWorkerCompleted( _
ByVal sender As Object, ByVal e As RunWorkerCompletedEventArgs) _
Handles backgroundWorker1.RunWorkerCompleted
' First, handle the case where an exception was thrown.
If (e.Error IsNot Nothing) Then
MessageBox.Show(e.Error.Message)
ElseIf e.Cancelled Then
' Next, handle the case where the user canceled the
' operation.
' Note that due to a race condition in
' the DoWork event handler, the Cancelled
' flag may not have been set, even though
' CancelAsync was called.
resultLabel.Text = "Canceled"
Else
' Finally, handle the case where the operation succeeded.
resultLabel.Text = e.Result.ToString()
End If
' Enable the UpDown control.
Me.numericUpDown1.Enabled = True
' Enable the Start button.
startAsyncButton.Enabled = True
' Disable the Cancel button.
cancelAsyncButton.Enabled = False
End Sub
Комментарии
Это событие возникает при возврате обработчика DoWork событий.
Если операция завершается успешно и ее результат назначается обработчику DoWork событий, доступ к результату можно получить через RunWorkerCompletedEventArgs.Result свойство .
Свойство ErrorSystem.ComponentModel.RunWorkerCompletedEventArgs указывает, что операция выдала исключение.
Свойство CancelledSystem.ComponentModel.RunWorkerCompletedEventArgs указывает, был ли запрос на отмену обработан фоновой операцией. Если код в обработчике DoWork событий обнаруживает запрос на отмену, проверив CancellationPending флаг и установив Cancel для флага System.ComponentModel.DoWorkEventArgstrue
значение , Cancelled флагу System.ComponentModel.RunWorkerCompletedEventArgs также будет присвоено значение true
.
Внимание!
Имейте в виду, что код в обработчике DoWork событий может завершить работу по мере отправки запроса на отмену, а для цикла опроса может не CancellationPending быть задано значение true
. В этом случае Cancelled флаг System.ComponentModel.RunWorkerCompletedEventArgs в RunWorkerCompleted обработчике событий не будет иметь значение true
, даже если был сделан запрос на отмену. Эта ситуация называется состоянием гонки и является общей проблемой в многопотоковом программировании. Дополнительные сведения о проблемах многопоточности см. в статье Рекомендации по использованию управляемых потоков.
Обработчик RunWorkerCompleted событий всегда должен проверка AsyncCompletedEventArgs.Error свойства и AsyncCompletedEventArgs.Cancelled перед доступом к свойству RunWorkerCompletedEventArgs.Result . Если возникло исключение или операция была отменена, при доступе к свойству RunWorkerCompletedEventArgs.Result возникает исключение.