Nie widzę różnic między nowymi funkcjami asynchronicznymi C# (i VB), a Task Parallel Library .NET 4.0. Weźmy, na przykład, kod Eric Lippert za from here:W jaki sposób funkcja async-await w C# 5.0 różni się od licencji TPL?
async void ArchiveDocuments(List<Url> urls) {
Task archive = null;
for(int i = 0; i < urls.Count; ++i) {
var document = await FetchAsync(urls[i]);
if (archive != null)
await archive;
archive = ArchiveAsync(document);
}
}
Wydaje się, że kluczowe await
obsługuje dwa różne cele. Pierwsze zdarzenie (FetchAsync
) wydaje się oznaczać, "Jeśli ta wartość jest używana później w metodzie i jej zadanie nie jest zakończone, poczekaj, aż zakończy się przed kontynuowaniem." Druga instancja (archive
) wydaje się oznaczać, "Jeśli to zadanie nie zostało jeszcze zakończone, poczekaj teraz, aż się zakończy." Jeśli się mylę, popraw mnie.
Czy nie można tak łatwo napisać w ten sposób?
void ArchiveDocuments(List<Url> urls) {
for(int i = 0; i < urls.Count; ++i) {
var document = FetchAsync(urls[i]); // removed await
if (archive != null)
archive.Wait(); // changed to .Wait()
archive = ArchiveAsync(document.Result); // added .Result
}
}
Mam zastąpił pierwszy await
z Task.Result
gdzie wartość jest rzeczywiście potrzebna, a drugi await
z Task.Wait()
, gdzie czas oczekiwania jest faktycznie występującej. Funkcjonalność jest już zaimplementowana, a (1)
znacznie ściślejsza semantycznie względem tego, co faktycznie dzieje się w kodzie.
Zdaję sobie sprawę, że metoda async
została przepisana jako maszyna stanu, podobna do iteratorów, ale nie widzę również korzyści, jakie przynosi. Każdy kod, który wymaga innego wątku do działania (takiego jak pobieranie) nadal będzie wymagał innego wątku, a każdy kod, który nie będzie działał (taki jak odczyt z pliku) może nadal wykorzystywać licencję TPL do pracy tylko z jednym wątkiem.
Oczywiście brakuje mi czegoś wielkiego; Czy ktokolwiek może mi pomóc zrozumieć to trochę lepiej?
także zobaczyć http://stackoverflow.com/questions/3513432/task-parallel-library-replacement-for-backgroundworker ? lq = 1 i http://stackoverflow.com/questions/12414601/async-await-vs-backgroundworker?lq=1 – nawfal
Zobacz ten link, który ma ładne przykłady: http://richnewman.wordpress.com/2012/12/03/tutorial-asynchroniczne programowanie-async-and-await-for-beginners/ – nawfal