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:
- Wielowątkowość w połączeniu z klasą BackgroundWorker.
- 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.
c#
.net
multithreading
async
robert.ecot
źródło
źródło
Odpowiedzi:
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
async
iawait
sł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 nieBackgroundWorker
.Jeśli nie musisz używać starszej wersji języka C #, sugeruję nauczenie się używania
async
iawait
.źródło
Te
async
iawait
sł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ącychTask
obiekty. Aby utworzyćasync
/await
faktycznie 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
.TaskCompletionSource
- Niestandardowy sposób obsługi zadań asynchronicznych. Jednym z miejsc, z których korzystałem, było zarządzanie zdarzeniami pochodzącymi zWebBrowser
kontroli.async
metody, takie jak wiele funkcji interfejsu API Win 8.Innymi słowy,
async
/await
jest rozszerzeniem wzorca asynchronicznego opartego na zadaniach . Można znaleźć dużą szereg informacji, w tym wielu próbek, tutaj .Jest
BackgroundWorker
to 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 wDoWork
module 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.
źródło
BackgroundWorker
, że jest szczególnie zalecane.Powiedziałbym, że
async
-await
jest znacznie bardziej elastyczny niżBackgroundWorker
. A jeśli chcesz zrobić coś, co pasujeBackgroundWorker
, możesz to zrobić za pomocąasync
-await
również z bardziej czytelnym i bezpieczniejszym dla kodu kodem.Z tego powodu uważam, że powinieneś preferować używanie over
async
-await
overBackgroundWorker
.źródło