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


Обзор компонента BackgroundWorker

Существует множество часто выполняемых операций, которые могут занять много времени для выполнения. Например:

  • Скачивание изображений

  • Вызовы веб-службы

  • Скачивание и отправка файлов (включая одноранговые приложения)

  • Сложные локальные вычисления

  • Транзакции базы данных

  • Локальный доступ к диску с учетом медленной скорости доступа к памяти

Такие операции могут привести к блокировке пользовательского интерфейса во время их выполнения. Если требуется адаптивный пользовательский интерфейс и вы столкнулись с длительными задержками, связанными с такими операциями, компонент BackgroundWorker предоставляет удобное решение.

Компонент BackgroundWorker предоставляет возможность выполнять длительные операции в фоновом режиме, асинхронно, в потоке, отличном от основного потока пользовательского интерфейса приложения. Чтобы использовать BackgroundWorker, сначала укажите, какой трудоемкий рабочий метод выполнять в фоновом режиме, а затем вызовите метод RunWorkerAsync. Вызывающий поток продолжает работать в обычном режиме, пока рабочий метод выполняется асинхронно. По завершении метода BackgroundWorker оповещает вызывающий поток, запуская событие RunWorkerCompleted, которое при необходимости содержит результаты операции.

Компонент доступен на вкладке Компоненты панели элементов . Чтобы добавить в свою форму, перетащите компонент на форму. Он отображается в панели компонентов, а его свойства отображаются в окне Свойства.

Чтобы запустить асинхронную операцию, используйте метод RunWorkerAsync. RunWorkerAsync принимает необязательный параметр object, который можно использовать для передачи аргументов в рабочий метод. Класс BackgroundWorker предоставляет событие DoWork, к которому присоединен рабочий поток через обработчик событий DoWork.

Обработчик событий DoWork принимает параметр DoWorkEventArgs, имеющий свойство Argument. Это свойство получает параметр из RunWorkerAsync и может передаваться в рабочий метод, который будет вызываться в обработчике событий DoWork. В следующем примере показано, как получить результат от рабочего метода с именем ComputeFibonacci. Это часть более крупного примера, который можно найти на странице Практическое руководство: реализация формы, использующая фоновую операцию.

// 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

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

Осторожность

При использовании многопоточности любого рода вы потенциально подвергаетесь очень серьезным и сложным ошибкам. Перед реализацией любого решения, использующего многопоточность, ознакомьтесь с рекомендациями по управляемой многопоточности.

Дополнительные сведения об использовании класса BackgroundWorker см. в разделе Как: выполнить операцию в фоновом режиме.

См. также