Я новичок в разработке на C # и хочу создать более отзывчивый интерфейс. В моем предварительном исследовании я видел два метода для достижения этой цели:
- Многопоточность в сочетании с классом BackgroundWorker.
- Более новые модификаторы Async / Await.
Новое значит лучше? В чем разница между двумя методами? Если я хочу создать новый проект, как мне выбрать, какой метод выбрать?
РЕДАКТИРОВАТЬ: Может быть, я должен уточнить. Я создаю приложение Windows Forms, где все необходимые данные будут сохранены / загружены на локальный диск. Я также буду общаться с несколькими USB-устройствами.
c#
.net
multithreading
async
robert.ecot
источник
источник
Ответы:
Вы сможете выполнить свою задачу, используя
BackgroundWorker
. Это хорошо известный класс, и многие люди использовали его.Новый C # 5
async
иawait
ключевые слова в основном просто облегчают написание читаемого асинхронного кода. Там может быть меньше учебников и примеров того, как выполнять различные задачи с этими ключевыми словами, а неBackgroundWorker
.Если вам не нужно использовать более старую версию C #, я предлагаю научиться использовать
async
иawait
.источник
В
async
иawait
ключевых словах не сделают ваше приложение более отзывчивым на своем собственном. Они просто делают вызов и обработку методов, которые возвращаютTask
объекты, более удобными. Для того, чтобы создаватьasync
/await
фактически использовать фоновые потоки, вам нужно сочетать с такими вещами, как:Task.Start()
- Запускает заданное задание, используяTaskScheduler
.TaskCompletionSource
- Пользовательский способ обработки асинхронных задач. Одно из мест, где я использовал это, было для обработки событий, поступающих от элементаWebBrowser
управления.async
методы, такие как многие функции в Win 8 API.Другими словами,
async
/await
является расширением асинхронного шаблона на основе задач . Вы можете найти большое количество информации, включая множество примеров, здесь .Это
BackgroundWorker
компонент WinForms, который создает 1 фоновый поток, используя асинхронный шаблон на основе событий , и вы можете заполнить работу, выполненную в этом фоновом потоке, своим собственным кодом вDoWork
обработчике событий. В общем, Microsoft больше не рекомендует использовать этот шаблон (см. Нижнюю часть страницы здесь ), хотя, если вы уже знакомы с ним, это может быть простой вариант.Другой вариант, не упомянутый, - это Реактивные расширения для .NET . Это еще одна отличная основа для добавления отзывчивости в ваши приложения.
источник
BackgroundWorker
, что , в частности, рекомендуется против.Я бы сказал, что
async
-await
гораздо более гибкий, чемBackgroundWorker
. И если вы хотите сделать что - то , что подходитBackgroundWorker
, вы можете сделать это сasync
-await
тоже, с более читаемой и более кодой типобезопасной.Из-за этого, я думаю, вы должны предпочесть использование
async
-await
болееBackgroundWorker
.источник