Nie można powrócić zadanie jeśli sama metoda jest uznane za async
- tak to nie będzie działać, na przykład :
async Task BarAsync()
{
return BazAsync(); // Invalid!
}
Wymagałoby to typu zwrotu Task<Task>
.
Jeśli metoda jest tylko robi niewielką ilość pracy, a następnie wywołanie tylko metody asynchronicznej jeden, wówczas pierwsza opcja jest w porządku, i oznacza, że istnieje jeden mniej zadaniem zaangażowany. Należy mieć świadomość, że wszelkie wyjątki generowane w ramach metody synchronicznej będą dostarczane synchronicznie - w istocie wolę obsługiwać sprawdzanie poprawności argumentów.
Jest to również powszechny wzorzec do implementacji przeciążania, np. przez token anulowania.
Pamiętaj, że jeśli musisz zmienić, aby poczekać na coś innego, musisz zamiast tego zastosować metodę asynchroniczną. Na przykład:
// Version 1:
Task BarAsync()
{
// No need to gronkle yet...
return BazAsync();
}
// Oops, for version 2 I need to do some more work...
async Task BarAsync()
{
int gronkle = await GronkleAsync();
// Do something with gronkle
// Now we have to await BazAsync as we're now in an async method
await BazAsync();
}
Może to być niebezpieczne, jeśli połączysz je z 'using':' using (something) {return BazAsync(); } 'i' using (something) {czekaj na BazAsync(); } 'zachowuj się bardzo różnie. – svick
Powiązanie podobnego pytania: http://stackoverflow.com/q/21033150/1768303 – Noseratio
Napisałem post na blogu o [zaletach i pułapkach eliding 'async' /' await'] (http: //blog.stephencleary. com/2016/12/eliding-async-await.html). –