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?
Odpowiedzi:
Task
Klasa jest poprawa nadBackgroundWorker
; 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
BackgroundWorker
sposób robienia rzeczy i nowyTask
sposó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.źródło
BackgroundWorker
ma łatwiejsze raportowanie postępów, a jednocześnieTask
umoż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ącychThread
lubThreadPool.QueueUserWorkItem
. Są absolutnie najtrudniejsze w prawidłowym użyciu do zadań w tle.userState
. Jednak w ciągu 2,5 roku od mojego ostatniego komentarzaTask
został uzupełniony oIProgress<T>
iProgress<T>
, które są czystsze i łatwiejsze niżBackgroundWorker
postęp. We współczesnym kodzie nie ma już żadnego powodu, aby go używaćBackgroundWorker
.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.
źródło