Zadanie zastępowania biblioteki równoległej dla BackgroundWorker?

83

Czy biblioteka równoległa zadań ma coś, co można by uznać za zamiennik lub ulepszenie w stosunku do klasy BackgroundWorker?

Mam aplikację WinForms z interfejsem użytkownika w stylu kreatora i wykonuje ona kilka długotrwałych zadań. Chcę mieć responsywny interfejs użytkownika ze standardowym paskiem postępu i możliwością anulowania operacji. Zrobiłem to już wcześniej w BackgroundWorker, ale zastanawiam się, czy są jakieś wzorce TPL, których można użyć zamiast tego?

Keith G.
źródło

Odpowiedzi:

91

TaskKlasa jest poprawa nad BackgroundWorker; w naturalny sposób obsługuje zagnieżdżanie (zadania nadrzędne / podrzędne), korzysta z nowego interfejsu API anulowania, kontynuacji zadań itp.

Na swoim blogu mam przykład pokazujący stary BackgroundWorkersposób robienia rzeczy i nowy Tasksposób robienia rzeczy. Mam małą klasę pomocniczą do zadań, które wymagają raportowania postępu, ponieważ uważam składnię za raczej niezręczną. Przykład obejmuje wartości wyników, warunki błędów, anulowanie i raportowanie postępu.

Stephen Cleary
źródło
Trudno zdecydować między tym a odpowiedzią Hatcha, ponieważ jego odpowiedź jest technicznie poprawna. Jednak Twój blog pokazuje, jak używać nowej klasy Task i właśnie tego szukałem - ewolucji od BackgroundWorker. Używam Twojego przykładu jako podstawy kodu w mojej aplikacji.
Keith G,
2
Kilka dni temu napisałem porównanie różnych technik przetwarzania w tle . BackgroundWorkerma łatwiejsze raportowanie postępów, a jednocześnie Taskumożliwia zagnieżdżanie. Spośród tych dwóch preferuję Task( znacznie łatwiej jest wyczyścić raportowanie postępu niż zezwolić na zagnieżdżanie). Jednak oba są lata świetlne przed innymi typowymi rozwiązaniami. Wzdrygam się, gdy słyszę o ludziach używających Threadlub ThreadPool.QueueUserWorkItem. Są absolutnie najtrudniejsze w prawidłowym użyciu do zadań w tle.
Stephen Cleary
Łatwiejsze raportowanie postępów? Tylko jeśli wszyscy chcesz zgłosić procent. Raportowanie cokolwiek innego wymaga BeginInvoke lub SynchronizationContext.Post brzydotę
Panagiotis Kanavos
5
@PanagiotisKanavos: Możesz przekazać dowolny obiekt jako userState. Jednak w ciągu 2,5 roku od mojego ostatniego komentarza Taskzostał uzupełniony o IProgress<T>i Progress<T>, które są czystsze i łatwiejsze niż BackgroundWorkerpostęp. We współczesnym kodzie nie ma już żadnego powodu, aby go używać BackgroundWorker.
Stephen Cleary
Tak, właśnie zauważyłem. W jakiś sposób ten post znalazł się na samym szczycie, gdy kliknąłem tag TPL, aby znaleźć nowe pytania!
Panagiotis Kanavos
23

Pracowanie w tle jest nadal prawidłowym sposobem osiągnięcia tego celu - jeśli jednocześnie uruchamiasz wiele dużych operacji, warto rozważyć równoległe rozszerzenia, jeśli to tylko jedno, to trzymałbym się pracownika w tle.

Właz
źródło