Jaka jest konwencja dodawania sufiksów do nazw metod z „Async”?
Czy przyrostek „Async” powinien być dodawany tylko do metody zadeklarowanej za pomocą async
modyfikatora?
public async Task<bool> ConnectAsync()
Czy wystarczy, że metoda po prostu zwróci Task<T>
lub Task
?
public Task<bool> ConnectAsync()
c#
.net
async-await
naming-conventions
naming
kasperhj
źródło
źródło
Odpowiedzi:
Myślę, że prawda jest niejednoznaczna nawet z dokumentacji Microsoftu:
http://msdn.microsoft.com/en-us/library/hh873177(v=vs.110).aspx
To już nie w porządku. Każda metoda z
async
jest asynchroniczna, a następnie mówi, że powinna zwracać alboTask
lubTask<T>
- co nie jest właściwe dla metod na górze stosu wywołań, na przykład Button_Click lubasync void
.Oczywiście trzeba się zastanowić, jaki jest cel tej konwencji?
Można powiedzieć, że
Async
konwencja sufiksu polega na komunikowaniu użytkownikowi API, że metoda jest oczekiwana. Aby metoda była oczekiwana, musi zwrócićTask
dla void lubTask<T>
dla metody zwracającej wartość, co oznacza, że sufiksem może być tylko ta ostatniaAsync
.Lub możesz powiedzieć, że
Async
konwencja sufiksu polega na komunikowaniu, że metoda może powrócić natychmiast, porzucając bieżący wątek w celu wykonania innej pracy i potencjalnie powodując wyścigi.Ten cytat z dokumentu Microsoft mówi:
http://msdn.microsoft.com/en-us/library/hh191443.aspx#BKMK_NamingConvention
Co nawet nie wspomina, że zwracanie własnych metod asynchronicznych
Task
wymagaAsync
sufiksu, co, jak sądzę, wszyscy się zgadzamy.Zatem odpowiedź na to pytanie może brzmieć: jedno i drugie. W obu przypadkach musisz dołączyć
Async
do metodasync
słowo kluczowe i zwrotTask
lubTask<T>
.Mam zamiar poprosić Stephena Tubusa o wyjaśnienie sytuacji.
Aktualizacja
Więc zrobiłem. A oto, co napisał nasz dobry człowiek:
Zwięzłe wskazówki zawarte w pierwszym zdaniu Stefana są wystarczająco jasne. Wyklucza,
async void
ponieważ tworzenie publicznego API o takim projekcie jest niezwykłe, ponieważ prawidłowym sposobem implementacji asynchronicznej pustki jest zwrócenie prostejTask
instancji i pozwolenie kompilatorowi na jego magię. Jeśli jednak chcesz miećpublic async void
rozszerzenie , zalecamy dołączenieAsync
. Inneasync void
metody top-of-stack , takie jak programy obsługi zdarzeń, zwykle nie są publiczne i nie mają znaczenia / kwalifikują się.Dla mnie mówi mi, że jeśli zastanawiam się nad dodawaniem sufiksu
Async
do aasync void
, prawdopodobnie powinienem zmienić go na znak ,async Task
aby dzwoniący mogli na niego poczekać, a następnie dołączyćAsync
.źródło
PersonString
lubPriceDecimal
tak po co używaćGetAsync
- konsumenci API asynchronicznego API nie muszą się tym martwić, ponieważ żądanie zawsze wraca po zakończeniu wszystkich zadań. To głupie i naprawdę denerwujące. Ale to tylko kolejna konwencja, że nikt tak naprawdę nie wie, dlaczego tam jest.Tworzę wiele usług API i innych aplikacji, które wywołują inne systemy, w których większość mojego kodu działa asynchronicznie.
Oto moja praktyczna zasada:
Przykłady:
Tylko jedna metoda:
Ta sama metoda z dwoma podpisami:
Ma to sens, ponieważ zwracane są te same dane, ale jedyną różnicą jest sposób ich zwracania , a nie same dane.
Myślę też, że te konwencje nazewnictwa istnieją ze względu na potrzebę wprowadzenia metod asynchronicznych i nadal zachowują kompatybilność wsteczną.
Twierdzę, że nowy kod nie powinien używać sufiksu Async. Jest to tak samo oczywiste, jak zwracany typ String lub Int, jak wspomniano wcześniej w tym wątku.
źródło
Te zadania opartego Asynchroniczna Wzór (TAP) mówi, że metody powinny zawsze zwraca
Task<T>
(aTask
) i są nazwane z Async końcówką; jest to niezależne od użyciaasync
. ObaTask<bool> Connect()
i będą się kompilować i działać dobrze, ale nie będziesz przestrzegać konwencji nazewnictwa TAP.async
Task<bool> Connect()
Jeśli treść metody (niezależnie od zwracanego typu lub nazwy) zawiera
await
, należy użyćasync
; a kompilator powie Ci „Operator 'await' może być używany tylko w ramach metody asynchronicznej. ...”. ZwrotTask<T>
lubTask
nie jest wystarczający, aby uniknąć używaniaasync
. Aby uzyskać szczegółowe informacje, zobacz async (odwołanie w C #) .Obie i prawidłowo przestrzegaj konwencji TAP. Zawsze możesz użyć słowa kluczowego, ale otrzymasz ostrzeżenie kompilatora „Ta metoda asynchroniczna nie ma operatorów„ await ”i będzie działać synchronicznie. ...”, jeśli ciało nie używa .
async
Task<bool> ConnectAsync()
Task<bool> ConnectAsync()
async
await
źródło
async
słowa kluczowego.async
to druga część pytania.async
modyfikatora. Zobacz także przykłady OP,public async Task<bool> ConnectAsync()
(zasync
modyfikatorem) vspublic Task<bool> ConnectAsync()
(bezasync
modyfikatora). Sama nazwa metody ma w obu przypadkach przyrostek „Async”.Task
lub metod, które mająasync Task
.Że. Słowo
async
kluczowe nie jest tutaj prawdziwym problemem. Jeśli zaimplementujesz asynchroniczność bez użyciaasync
słowa kluczowego, metoda jest nadal „Async” w sensie ogólnym.źródło
Ponieważ
Task
iTask<T>
to zarówno awaitable typy stanowią one część działanie asynchroniczne. A przynajmniej powinni reprezentować.Należy dodać sufiks
Async
do metody, która w niektórych przypadkach (niekoniecznie we wszystkich) nie zwraca wartości, a raczej zwraca opakowanie wokół trwającej operacji. Zwykle jest to opakowanieTask
, ale w systemie Windows RT może to byćIAsyncInfo
. Podążaj za swoim przeczuciem i pamiętaj, że jeśli użytkownik twojego kodu zobaczyAsync
funkcję, będzie wiedział, że wywołanie tej metody jest oddzielone od wyniku tej metody i że musi odpowiednio działać.Zauważ, że istnieją metody, takie jak
Task.Delay
i,Task.WhenAll
które zwracają,Task
ale nie mają rozszerzeniaAsync
sufiksu.Zauważ również, że istnieją
async void
metody, które reprezentują metodę asynchroniczną odpal i zapomnij i powinieneś mieć świadomość, że metoda jest zbudowana w taki sposób.źródło
Twierdziłbym, że powinien używać sufiksu Async, jeśli zwraca Task, niezależnie od tego, czy metoda jest zadeklarowana z
async
modyfikatorem, czy nie.Powodem jest to, że nazwa jest zadeklarowana w interfejsie. Interfejs deklaruje zwracany typ, którym jest
Task
. Następnie istnieją dwie implementacje tego interfejsu, jedna implementacja implementuje go za pomocąasync
modyfikatora, a druga nie.źródło
W programowaniu asynchronicznym z async i await (C #) firma Microsoft oferuje następujące wskazówki:
Uważam, że te wskazówki są niekompletne i niezadowalające. Czy to oznacza, że w przypadku braku
async
modyfikatora ta metoda powinna być nazwanaConnect
zamiastConnectAsync
?Nie sądzę. Jak wskazano w odpowiedzi zwięzłej przez @Servy i bardziej szczegółową odpowiedź przez @Luke Puplett , wierzę, że jest to właściwe i rzeczywiście oczekiwać, że metoda ta powinna być nazwane
ConnectAsync
(ponieważ zwraca awaitable). Na dalsze poparcie, @John Skeet w tej odpowiedzi na inne pytanie dołączaAsync
do nazwy metody, niezależnie od obecnościasync
modyfikatora.Wreszcie, w innym pytaniu , należy rozważyć ten komentarz przez @Damien_The_Unbeliever :
Z tego wnioskuję, że to asynchroniczny charakter metody decyduje o tym, jak należy ją nazwać. Użytkownik metody nie będzie nawet wiedział, czy
async
modyfikator jest używany w jej implementacji (bez kodu źródłowego C # lub CIL).źródło