Завдання паралельної заміни бібліотеки для BackgroundWorker?


83

Чи має паралельна бібліотека завдань щось, що можна вважати заміною або вдосконаленням порівняно з класом BackgroundWorker?

У мене є програма WinForms з інтерфейсом у стилі майстра, і вона виконує деякі тривалі завдання. Я хочу мати адаптивний інтерфейс зі стандартним індикатором прогресу та можливість скасувати операцію. Я робив це раніше з BackgroundWorker, але мені цікаво, чи є деякі шаблони TPL, які можна використовувати замість цього?


Відповіді:


91

TaskКлас є поліпшенням по порівнянні BackgroundWorker; він, природно, підтримує вкладеність (батьківські / дочірні завдання), використовує новий API скасування, продовження завдань тощо.

У моєму щоденнику є приклад , який демонструє колишній BackgroundWorkerспосіб роботи та новий Taskспосіб здійснення речей. У мене є невеликий допоміжний клас для завдань, які повинні повідомляти про прогрес, оскільки синтаксис мені здається досить незручним. Приклад охоплює значення результатів, умови помилок, скасування та звітування про хід.


Важко визначитися між цим та відповіддю Хетча, оскільки технічно він є правильною. Однак у вашому блозі показано, як використовувати новий клас Task, і це справді те, що я шукав - еволюція від BackgroundWorker. Я використовую ваш приклад як основу для коду в моїй програмі.
Keith G

2
Кілька днів тому я склав порівняння різних методів фонової обробки . BackgroundWorkerмає простіший звіт про хід, в той час як Taskдозволяє вкладання. З цих двох я віддаю перевагу Task( набагато простіше очистити звіти про хід, ніж дозволити вкладання). Однак вони обидва світлові роки попереду інших загальних рішень. Я стискаюся, коли чую, як люди використовують Threadабо ThreadPool.QueueUserWorkItem. Їх абсолютно важко використовувати правильно для фонових завдань.
Стівен Клірі

Простіше звітувати про хід? Тільки якщо всі ви хочете повідомити про відсоток. Повідомлення про що-небудь інше вимагає begininvoke або SynchronizationContext. Опублікувати потворність
Panagiotis Kanavos

5
@PanagiotisKanavos: Ви можете передати будь-який довільний об'єкт як userState. Однак за 2,5 роки, що минули після мого останнього коментаря, Taskбуло додано IProgress<T>та Progress<T>, які є чистішими та простішими, ніж BackgroundWorkerпрогрес. У сучасному коді немає жодної причини для використання BackgroundWorkerбільше взагалі.
Стівен Клірі

Так, я щойно помітив. Якимось чином ця публікація стала найвищою, коли я натиснув на тег TPL, щоб знайти нові запитання!
Панайотис Канавос

23

Фоновий працівник все ще є валідним способом досягнення цього - якщо ви виконуєте кілька великих операцій одночасно, тоді паралельні розширення варто було б розглянути, якщо це лише те, що я б дотримувався з фоновим співробітником.

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