BackgroundWorker vs. Async / Await

17

Jestem nowy w rozwoju C # i chcę stworzyć bardziej responsywny interfejs użytkownika. W moich wstępnych badaniach widziałem dwie metody osiągnięcia tego:

  1. Wielowątkowość w połączeniu z klasą BackgroundWorker.
  2. Nowsze modyfikatory Async / Await.

Czy nowsze oznaczają lepsze? Jaka jest różnica między tymi dwiema metodami? Jeśli chcę stworzyć nowy projekt, jak wybrać odpowiednią metodę?

EDYCJA: Może powinienem sprecyzować. Tworzę aplikację Windows Forms, w której wszystkie niezbędne dane zostaną zapisane / załadowane na dysk lokalny. Będę również komunikować się z kilkoma urządzeniami USB.

robert.ecot
źródło

Odpowiedzi:

10

Będziesz mógł wykonać swoje zadanie za pomocą BackgroundWorker. Jest to klasa dobrze znana i wiele osób z niej korzysta.

Nowe C # 5 asynci awaitsłowa kluczowe w zasadzie ułatwiają pisanie czytelnego kodu asynchronicznego. Może być mniej samouczków i przykładów wykonywania różnych zadań za pomocą tych słów kluczowych, a nie BackgroundWorker.

Jeśli nie musisz używać starszej wersji języka C #, sugeruję nauczenie się używania asynci await.

M. Dudley
źródło
14

Te asynci awaitsłowa kluczowe nie sprawi, że stosowanie bardziej wrażliwy na własną rękę. Po prostu ułatwiają wywoływanie i obsługę metod zwracających Taskobiekty. Aby utworzyć async/ awaitfaktycznie użyć wątków w tle, musisz połączyć je z użyciem takich rzeczy jak:

  • Task.Start()- Rozpoczyna dane zadanie za pomocą TaskScheduler.
  • PLINQ - Wykonaj szereg operacji równolegle, zwraca zadanie.
  • TaskCompletionSource- Niestandardowy sposób obsługi zadań asynchronicznych. Jednym z miejsc, z których korzystałem, było zarządzanie zdarzeniami pochodzącymi z WebBrowserkontroli.
  • Inne asyncmetody, takie jak wiele funkcji interfejsu API Win 8.

Innymi słowy, async/ awaitjest rozszerzeniem wzorca asynchronicznego opartego na zadaniach . Można znaleźć dużą szereg informacji, w tym wielu próbek, tutaj .

Jest BackgroundWorkerto składnik WinForms, który tworzy 1 wątek w tle przy użyciu wzorca asynchronicznego opartego na zdarzeniu , i można wypełnić pracę wykonaną w tym wątku własnym kodem w DoWorkmodule obsługi zdarzeń. Ogólnie rzecz biorąc, firma Microsoft zaleca, nie używając do tego wzorca (patrz na dole strony tutaj ), choć jeśli są zaznajomieni z nim już może wciąż być prostym rozwiązaniem.

Inną niewymienioną opcją są Reaktywne rozszerzenia dla platformy .NET . To kolejny świetny sposób na dodanie odpowiedzi do twoich aplikacji.

Kevin McCormick
źródło
Kiedy mówisz, że Win 8 API oznacza, że ​​oznacza to, że funkcje Async nie są tak dobrze obsługiwane w Windows 7 (mojej platformie docelowej)?
robert.ecot
1
Cześć Robert, interfejs API Win 8 .NET (dla aplikacji w stylu „Metro”) korzystający z asynchronizacji i czeka na wszystko, od we / wy pliku do wyświetlania okien dialogowych. W innych komponentach .NET, na przykład FileStream, można także użyć async / await z metodami takimi jak Stream.ReadAsync. Więc jest także wsparcie poza Win 8.
Kevin McCormick
Świetnie, a także dzięki za zaktualizowane linki! Bardzo pomocny.
robert.ecot
1
Nie widzę nic na tej stronie, co wskazywałoby na to BackgroundWorker, że jest szczególnie zalecane.
Kyralessa
Polecam również przeczytanie Async VS BackgroundWorker i serii postów na blogu o programowaniu współbieżnym w C # Stephena Clearly, autora omonimowej książki opublikowanej przez O'Reilly.
sentenza,
3

Powiedziałbym, że async- awaitjest znacznie bardziej elastyczny niż BackgroundWorker. A jeśli chcesz zrobić coś, co pasuje BackgroundWorker, możesz to zrobić za pomocą async- awaitrównież z bardziej czytelnym i bezpieczniejszym dla kodu kodem.

Z tego powodu uważam, że powinieneś preferować używanie over async- awaitover BackgroundWorker.

svick
źródło