2010-08-18 12 views
75

Czy biblioteka równoległa do zadań ma coś, co można by uznać za zastąpienie lub ulepszenie w stosunku do klasy BackgroundWorker?Zadanie równoległej biblioteki wymiany dla BackgroundWorker?

Mam aplikację WinForms z interfejsem w stylu kreatora i wykonuje ona wiele długotrwałych zadań. Chcę mieć responsywny interfejs użytkownika ze standardowym paskiem postępu i możliwość anulowania operacji. Zrobiłem to wcześniej z BackgroundWorker, ale zastanawiam się, czy istnieją pewne wzory TPL, które mogą być używane zamiast?

+0

Zobacz także http://stackoverflow.com/questions/4054263/how-does-c-sharp-5-0s-async-await-feature-differ-from-the-tpl i http://stackoverflow.com/questions/12414601/async-await-vs -workworker – nawfal

Odpowiedz

87

Klasa Task stanowi ulepszenie w stosunku do BackgroundWorker; to naturalnie wspiera gniazdowania (zadania rodzic/dziecko), wykorzystuje nową anulowania API, kontynuacje zadań itd

I have an example on my blog, pokazując stare BackgroundWorker sposób robienia rzeczy i nowego Task sposób robienia rzeczy. Mam małą klasę pomocniczą dla zadań, które muszą raportować postępy, ponieważ uważam, że składnia jest raczej niezręczna. Przykład obejmuje wartości wyników, warunki błędów, anulowanie i raportowanie postępów.

+0

Twarde rozstrzygnięcie pomiędzy tą a Hatcha odpowiedzią, ponieważ jest technicznie poprawną odpowiedzią. Jednak Twój blog pokazuje, jak korzystać z nowej klasy zadań, i naprawdę tego właśnie szukałem - ewolucji od BackgroundWorker. Używam twojego przykładu jako podstawy dla kodu w mojej aplikacji. –

+2

Kilka dni temu napisałem [porównanie różnych technik przetwarzania w tle] (http://nitoprograms.blogspot.com/2010/08/various-implementations-of-asynchronous.html). 'BackgroundWorker' ma łatwiejsze raportowanie postępu, a' Task' pozwala na zagnieżdżanie. Z tych dwóch preferuję "zadanie" (łatwiej jest wyczyścić raport z postępu niż pozwolić na zagnieżdżanie). Są jednak o wiele lat świetlne od innych powszechnych rozwiązań. Zażartuję, gdy słyszę o ludziach używających 'Thread' lub' ThreadPool.QueueUserWorkItem'. Są absolutnie najtrudniejsze do prawidłowego użycia w zadaniach tła. –

+0

Łatwiejsze zgłaszanie postępów? Tylko jeśli chcesz zgłosić procent. Zgłaszanie czegokolwiek innego wymaga begininvoke lub SynchronizationContext.post brzydota –

23

Pracownik w tle jest nadal ważnym sposobem na osiągnięcie tego celu - jeśli równolegle uruchamiasz wiele dużych operacji, warto rozważyć równoległe rozszerzenia, o ile tylko wtedy będę trzymać się pracującego w tle.

+2

A Bgw będzie czerpał zyski z ulepszonego ThreadPool –

Powiązane problemy