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

Обновлен: Ноябрь 2007

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

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

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

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

  • сложные вычисления, выполняемые локально;

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

  • доступ к локальному диску при условии его низкой скорости по сравнению со временем доступа к оперативной памяти.

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

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

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

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

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

' 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 'backgroundWorker1_DoWork
// 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,
// 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 = (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.set_Result(new Long(ComputeFibonacci(System.Convert.ToInt32
        (e.get_Argument()), worker, e)));
    //e.Result = ComputeFibonacci((int)e.Argument, worker, e); 
} //backgroundWorker1_DoWork

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

8xs8549b.alert_caution(ru-ru,VS.90).gifВнимание!

При использовании многопоточных программ возникает опасность весьма серьезных и сложных ошибок. Ознакомьтесь с разделом Рекомендации по работе с потоками перед реализацией любых многопоточных решений.

Дополнительные сведения об использовании класса BackgroundWorker см. в разделе Практическое руководство. Фоновое выполнение операции.

См. также

Задачи

Практическое руководство. Реализация формы, в которой выполняется фоновая операция

Другие ресурсы

Многопотоковость в Visual Basic