Обзор компонента 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 см. в разделе Как: выполнить операцию в фоновом режиме.
См. также
.NET Desktop feedback