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


Общие сведения о компоненте BackgroundWorker

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

  • Загрузка изображений

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

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

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

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

  • Обращение к локальному диску в случае низкой скорости по сравнению с доступом к памяти

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

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

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

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

См. также