Отличия делегатов от BackgroundWorker? - PullRequest
0 голосов
/ 22 декабря 2010

Может кто-нибудь объяснить разницу между Делегатами и BackgroundWorker? В этом случае Backgroundworker более эффективен, чем Делегат? Поскольку у нас есть асинхронный делегат, что необходимо для использования BackGroungWorker.

Ответы [ 4 ]

9 голосов
/ 22 декабря 2010

BackgroundWorker * * 1004

Класс BackgroundWorker позволяет запускать операцию в отдельном выделенном потоке.

Delegate:

Делегат - это тип, который определяет сигнатуру метода. ... Делегаты используются для передачи методов в качестве аргументов другим методам.


Вопрос о том, какой из них использовать, не имеет ничего общего с эффективностью.

BackgroundWorker - это оболочка, которая упрощает работу с потоками, вы также можете использовать асинхронные делегаты, но правильное управление ими намного сложнее. Или из MSDN:

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

4 голосов
/ 22 декабря 2010

У меня есть краткое сравнение BackgroundWorker, асинхронных делегатов и других подходов в моем блоге (с точки зрения выполнения фоновых операций).

BackgroundWorker имеет следующие преимущества:

  • Отчет о прогрессе прост. Любой BackgroundWorker, свойство WorkerSupportsProgress которого имеет значение true, может сообщать о прогрессе. Делегат DoWork может вызывать ReportProgress, что вызывает событие ProgressChanged.
  • Есть встроенная система для совместного отмены. Поток отмены сначала вызывает BackgroundWorker.CancelAsync. Это приводит к тому, что свойство BackgroundWorker.CancellationPending становится истинным. Делегат DoWork должен следить за этим свойством (проверяя его регулярно) и установить DoWorkEventArgs.Cancel в значение true и возвращать, если операция отменена. Делегат RunWorkerCompleted обнаруживает отмененный результат, проверяя RunWorkerCompletedEventArgs.Cancelled.
  • Синхронизация автоматическая, как для индикации завершения, так и для отчетов о проделанной работе. События ProgressChanged и RunWorkerCompleted синхронизируются с SynchronizationContext, существовавшим при вызове RunWorkerAsync.

Асинхронные делегаты имеют это преимущество:

  • Возврат значения прост; он только что вернулся.

В заключение я рекомендую использовать Task<TResult> вместо BackgroundWorker или асинхронных делегатов.

2 голосов
/ 22 декабря 2010

Фоновый рабочий в основном предназначен для работы с пользовательским интерфейсом, когда вам нужно легко запустить задачу в фоновом потоке и предоставить обновления прогресса на экран.

Одним из преимуществ является то, что он выполняет обратные вызовы для потока пользовательского интерфейса, поэтому вам не нужно проверять InvokeRequired и т. Д.

Делегаты - это более общий механизм для передачи функций в качестве аргументов, и, выполняя их асинхронно, они дают вам простой способ запуска этих методов в другом потоке.

1 голос
/ 22 декабря 2010

Фоновый рабочий - это абстракция, помогающая выполнить операцию в отдельном потоке.

Делегаты на самом деле не запускают отдельные потоки - это тип для ссылки на методы.

Но то, что вас, вероятно, интересует, - это когда вы должны использовать асинхронные методы вместо фонового работника. У меня нет особого опыта в этом, но Андерс Хейлсберг говорил об этом в своей сессии на PDC о будущем C # .

Я получил сообщение о том, что в некоторых случаях асинхронные методы предпочтительнее из-за меньшей сложности. Поток пользовательского интерфейса будет по-прежнему заблокирован, но не так долго, чтобы это имело значение.

...