BackgroundWorker vs. Async / Await


17

Я новачок у розробці C # і хочу створити більш чуйний інтерфейс користувача. У своєму попередньому дослідженні я бачив два методи досягнення цього:

  1. Багаторядне поєднання з класом BackgroundWorker.
  2. Новіші модифікатори Async / Await.

Чи означає новіше краще? Яка різниця між двома методами? Якщо я хочу створити новий проект, то як вибрати метод, який слід використовувати?

EDIT: Можливо, я повинен уточнити. Я створюю додаток Windows Forms, де всі необхідні дані будуть збережені / завантажені на локальний диск. Я також буду спілкуватися з кількома пристроями USB.


Відповіді:


10

Ви зможете виконати своє завдання, використовуючи BackgroundWorker. Це добре відомий клас, і багато людей його використовували.

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

Якщо вам не потрібно використовувати більш стару версію C #, я пропоную навчитися користуватися asyncта await.


14

В asyncі awaitключових словах не зроблять ваше додаток більш чуйним на своєму власному. Вони просто роблять виклик та поводження з методами, які повертають Taskоб'єкти, більш зручними. Щоб зробити async/ awaitфактично використовувати фонові нитки, вам потрібно буде поєднати з використанням таких речей, як:

  • Task.Start()- Починає задане завдання за допомогою TaskScheduler.
  • PLINQ - Виконує паралельно ряд операцій, повертає Завдання.
  • TaskCompletionSource- Спеціальний спосіб обробляти завдання асинхронізації. Я використовував це місце для обробки подій, що надходять з WebBrowserконтролю.
  • Інші asyncметоди, наприклад, багато функцій в API Win 8.

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

Компонент BackgroundWorkerWinForms, який створює 1 фоновий потік за допомогою асинхронного шаблону на основі подій , і ви можете заповнити роботу, виконану над цим потоком фону, власним кодом у DoWorkобробці подій. Загалом, Microsoft більше не рекомендує використовувати цей шаблон (див. Внизу сторінки тут ), хоча якщо ви вже знайомі з ним, це все ще може бути простим варіантом.

Інший варіант, який не згадується, - це Реактивні розширення для .NET . Це ще одна чудова рамка для додавання чутливості до ваших додатків.


Якщо ви скажете API Win 8, чи означає це, що функції Async не так добре підтримуються в Windows 7 (моя цільова платформа)?
robert.ecot

1
Привіт, Роберт, API Win. В інших компонентах .NET, наприклад, FileStream, ви також можете використовувати async / wait за допомогою таких методів, як Stream.ReadAsync. Тож є якась підтримка і поза Win 8.
Кевін МакКормік

Чудово, і дякую за оновлені посилання теж! Дуже корисний.
robert.ecot

1
Я не бачу нічого на цій сторінці, що вказувало б на те BackgroundWorker, що рекомендується проти.
Kyralessa

Я також рекомендую прочитати Async VS BackgroundWorker та серію публікацій в блозі про одночасне програмування в C # Стівена Ясно, автора всемовірної книги, виданої O'Reilly.
sentenza

3

Я б сказав, що async- awaitнабагато гнучкіший, ніж BackgroundWorker. І якщо ви хочете зробити щось, що підходить BackgroundWorker, ви можете зробити це і з async- awaitтакож з більш читабельним і більш безпечним для типу кодом.

Через це, я думаю, вам слід віддати перевагу використанню async- awaitпонад BackgroundWorker.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.