Общие сведения о компоненте 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.
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);
}
Дополнительные сведения об использовании обработчиков событий см. в разделе события.
Caution
При использовании любой многопоточности существует потенциальная возможность возникновения серьезных ошибок. Перед реализацией любого решения, в котором используется многопоточность, ознакомьтесь с разделом Рекомендации по работе с потоками.
Дополнительные сведения об использовании BackgroundWorker , представлена в разделе как: Фоновое выполнение операции.