Наследование от BackgroundWorker

BackgroundWorker не запечатан (sealed) и предоставляет виртуальный метод OnDoWork, давая возможность реализовать его по-своему. Когда разрабатывается потенциально долго выполняемый метод, можно использовать наследника BackgroundWorker, предназначенного для асинхронного выполнения работы. Использующий его код должен будет только обрабатывать события RunWorkerCompleted и ProgressChanged. Предположим, что у нас есть долго выполняющийся метод GetFinancialTotals:

public class Client { Dictionary <string,int> GetFinancialTotals(int foo, int bar) {... } ... }

Можно реорганизовать его следующим образом:

public class Client { public FinancialWorker GetFinancialTotalsBackground(int foo, int bar) { return new FinancialWorker(foo, bar); } } public class FinancialWorker: BackgroundWorker { // Можно добавить типизированные поля. public Dictionary <string,int> Result; // Можно выставить их наружу как свойства с блокировками! public volatile int Foo; public volatile int Bar; public FinancialWorker() { WorkerReportsProgress = true; WorkerSupportsCancellation = true; } public FinancialWorker(int foo, int bar): this() { Foo = foo; Bar = bar; } protected override void OnDoWork(DoWorkEventArgs e) { ReportProgress(0, "Вкалываем... над отчетом...в поте лица..."); Initialize financial report data while (!finished report) { if (CancellationPending) { e.Cancel = true; return; } Perform another calculation step ReportProgress(percentCompleteCalc, "Продолжаем работу..."); } ReportProgress(100, "Готово!"); e.Result = Result = completed report data; } }

Вызвавший GetFinancialTotalsBackground получит FinancialWorker – практичную обертку, управляющую фоновой операцией. Она может сообщать о прогрессе операции, поддерживает отмену и совместима с Windows Forms без использования Control.Invoke. Кроме того, она обрабатывает возможные исключения и использует стандартный протокол (попробуйте-ка получить все это без использования BackgroundWorker!).

Возможность использования BackgroundWorker хоронит старую “асинхронную модель, основанную на событиях”.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: