BackgroundWorker против Async / Await

16

Я новичок в разработке на C # и хочу создать более отзывчивый интерфейс. В моем предварительном исследовании я видел два метода для достижения этой цели:

  1. Многопоточность в сочетании с классом BackgroundWorker.
  2. Более новые модификаторы Async / Await.

Новое значит лучше? В чем разница между двумя методами? Если я хочу создать новый проект, как мне выбрать, какой метод выбрать?

РЕДАКТИРОВАТЬ: Может быть, я должен уточнить. Я создаю приложение Windows Forms, где все необходимые данные будут сохранены / загружены на локальный диск. Я также буду общаться с несколькими USB-устройствами.

robert.ecot
источник

Ответы:

10

Вы сможете выполнить свою задачу, используя BackgroundWorker. Это хорошо известный класс, и многие люди использовали его.

Новый C # 5 asyncи awaitключевые слова в основном просто облегчают написание читаемого асинхронного кода. Там может быть меньше учебников и примеров того, как выполнять различные задачи с этими ключевыми словами, а не BackgroundWorker.

Если вам не нужно использовать более старую версию C #, я предлагаю научиться использовать asyncи await.

М. Дадли
источник
13

В asyncи awaitключевых словах не сделают ваше приложение более отзывчивым на своем собственном. Они просто делают вызов и обработку методов, которые возвращают Taskобъекты, более удобными. Для того, чтобы создавать async/ awaitфактически использовать фоновые потоки, вам нужно сочетать с такими вещами, как:

  • Task.Start()- Запускает заданное задание, используя TaskScheduler.
  • PLINQ - выполняет серию операций параллельно, возвращает задачу.
  • TaskCompletionSource- Пользовательский способ обработки асинхронных задач. Одно из мест, где я использовал это, было для обработки событий, поступающих от элемента WebBrowserуправления.
  • Другие asyncметоды, такие как многие функции в Win 8 API.

Другими словами, async/ awaitявляется расширением асинхронного шаблона на основе задач . Вы можете найти большое количество информации, включая множество примеров, здесь .

Это BackgroundWorkerкомпонент WinForms, который создает 1 фоновый поток, используя асинхронный шаблон на основе событий , и вы можете заполнить работу, выполненную в этом фоновом потоке, своим собственным кодом в DoWorkобработчике событий. В общем, Microsoft больше не рекомендует использовать этот шаблон (см. Нижнюю часть страницы здесь ), хотя, если вы уже знакомы с ним, это может быть простой вариант.

Другой вариант, не упомянутый, - это Реактивные расширения для .NET . Это еще одна отличная основа для добавления отзывчивости в ваши приложения.

Кевин Маккормик
источник
Когда вы говорите, что Win 8 API, означает ли это, что функции Async не так хорошо поддерживаются в Windows 7 (моя целевая платформа)?
robert.ecot
1
Привет, Роберт! Win 8 .NET API (для приложений в стиле Metro), использующий асинхронную синхронизацию, и с нетерпением ждем всего, от ввода-вывода файлов до отображения диалоговых окон. В других компонентах .NET, например FileStream, вы также можете использовать async / await с такими методами, как Stream.ReadAsync. Так что есть некоторая поддержка и за пределами Win 8.
Кевин Маккормик
Отлично, и спасибо за обновленные ссылки тоже! Очень полезно.
robert.ecot
1
На этой странице я не вижу ничего, что указывало бы на то BackgroundWorker, что , в частности, рекомендуется против.
Kyralessa
Я также рекомендую прочитать Async VS BackgroundWorker и серию постов в блоге о параллельном программировании на C # Стивена Ясно, автора анонимной книги, опубликованной О'Рейли.
предложение
3

Я бы сказал, что async- awaitгораздо более гибкий, чем BackgroundWorker. И если вы хотите сделать что - то , что подходит BackgroundWorker, вы можете сделать это с async- awaitтоже, с более читаемой и более кодой типобезопасной.

Из-за этого, я думаю, вы должны предпочесть использование async- awaitболее BackgroundWorker.

svick
источник