Общие сведения о компоненте BackgroundWorkerBackgroundWorker Component Overview

Выполнение многих часто выполняемых операций может занимать длительное время.There are many commonly performed operations that can take a long time to execute. Например:For example:

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

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

  • Скачивание и загрузка файлов (в т. ч. через одноранговые приложения)File downloads and uploads (including for peer-to-peer applications)

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

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

  • Обращение к локальному диску в случае низкой скорости по сравнению с доступом к памятиLocal disk access, given its slow speed relative to memory access

Запуск таких операций может замедлить работу пользовательского интерфейса.Operations like these can cause your user interface to hang while they are running. Если вы хотите получить отзывчивый пользовательский интерфейс, но столкнулись с длительными задержками в результате выполнения таких операций, удобным решением станет компонент BackgroundWorker.When you want a responsive UI and you are faced with long delays associated with such operations, the BackgroundWorker component provides a convenient solution.

Компонент BackgroundWorker позволяет выполнять длительные операции асинхронно (в фоновом режиме), т. е. в потоке, отличающемся от основного потока пользовательского интерфейса.The BackgroundWorker component gives you the ability to execute time-consuming operations asynchronously ("in the background"), on a thread different from your application's main UI thread. Для использование компонента BackgroundWorker необходимо только указать, какой рабочий метод обработки длительных операций будет выполняться в фоновом режиме, а затем вызвать метод RunWorkerAsync.To use a BackgroundWorker, you simply tell it what time-consuming worker method to execute in the background, and then you call the RunWorkerAsync method. Вызывающий поток продолжает работать нормально, в то время как рабочий метод работает асинхронно.Your calling thread continues to run normally while the worker method runs asynchronously. Когда метод закончит работу, компонент BackgroundWorker предупредит вызывающий поток событием RunWorkerCompleted, которое может содержать результаты операции.When the method is finished, the BackgroundWorker alerts the calling thread by firing the RunWorkerCompleted event, which optionally contains the results of the operation.

BackgroundWorker Компонент можно загрузить из элементовв компоненты вкладки. Чтобы добавить компонент BackgroundWorker в форму, перетащите компонент BackgroundWorker в соответствующую форму.The BackgroundWorker component is available from the Toolbox, in the Components tab. To add a BackgroundWorker to your form, drag the BackgroundWorker component onto your form. Он отображается в области компонентов, а его свойства отобразятся в свойства окна.It appears in the component tray, and its properties appear in the Properties window.

Для запуска асинхронной работы используйте метод RunWorkerAsync.To start your asynchronous operation, use the RunWorkerAsync method. RunWorkerAsync принимает необязательный object параметр, который может использоваться для передачи аргументов в рабочий метод.RunWorkerAsync takes an optional object parameter, which can be used to pass arguments to your worker method. Класс BackgroundWorker показывает событие DoWork, к которому обработчик событий DoWork прикрепляет рабочий поток.The BackgroundWorker class exposes the DoWork event, to which your worker thread is attached through a DoWork event handler.

Обработчик событий DoWork задействует параметр DoWorkEventArgs со свойством Argument.The DoWork event handler takes a DoWorkEventArgs parameter, which has an Argument property. Данное свойство получает параметр из RunWorkerAsync и может быть передано в рабочий метод, который будет вызываться в обработчике событий DoWork.This property receives the parameter from RunWorkerAsync and can be passed to your worker method, which will be called in the DoWork event handler. В следующем примере показан способ назначения результата из рабочего метода, который называется ComputeFibonacci.The following example shows how to assign a result from a worker method called ComputeFibonacci. Он является частью большего примера, который можно найти в как: реализация формы, в которой выполняется фоновая операция.It is part of a larger example, which you can find at How to: Implement a Form That Uses a Background Operation.

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

Дополнительные сведения об использовании обработчиков событий см. в разделе события.For more information on using event handlers, see Events.

Внимание!

При использовании любой многопоточности существует потенциальная возможность возникновения серьезных ошибок.When using multithreading of any sort, you potentially expose yourself to very serious and complex bugs. Перед реализацией любого решения, в котором используется многопоточность, ознакомьтесь с разделом Рекомендации по работе с потоками.Consult the Managed Threading Best Practices before implementing any solution that uses multithreading.

Дополнительные сведения об использовании BackgroundWorker см. в описании как: выполнение операции в фоновом режиме.For more information on using the BackgroundWorker class, see How to: Run an Operation in the Background.

См. такжеSee Also

(Не относится к этой сборке) Многопоточность в Visual BasicNOT IN BUILD: Multithreading in Visual Basic
Практическое руководство. Реализация формы, в которой выполняется фоновая операцияHow to: Implement a Form That Uses a Background Operation