Myślę, że prawda jest niejednoznaczna nawet z dokumentacji Microsoftu:
W programie Visual Studio 2012 i .NET Framework 4.5 każda metoda, której przypisano async
słowo kluczowe ( Async
w języku Visual Basic), jest uważana za metodę asynchroniczną, a kompilatory C # i Visual Basic wykonują niezbędne transformacje, aby zaimplementować metodę asynchronicznie przy użyciu TAP. Metoda asynchroniczna powinna zwracać obiekt Task
lub Task<TResult>
obiekt.
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ć albo Task
lub Task<T>
- co nie jest właściwe dla metod na górze stosu wywołań, na przykład Button_Click lub async 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 lub Task<T>
dla metody zwracającej wartość, co oznacza, że sufiksem może być tylko ta ostatnia Async
.
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:
Zgodnie z konwencją dodajesz „Async” do nazw metod, które mają modyfikator Async lub async.
http://msdn.microsoft.com/en-us/library/hh191443.aspx#BKMK_NamingConvention
Co nawet nie wspomina, że zwracanie własnych metod asynchronicznych Task
wymaga Async
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 metod async
słowo kluczowe i zwrot Task
lub Task<T>
.
Mam zamiar poprosić Stephena Tubusa o wyjaśnienie sytuacji.
Aktualizacja
Więc zrobiłem. A oto, co napisał nasz dobry człowiek:
Jeśli metoda publiczna zwraca Task i ma charakter asynchroniczny (w przeciwieństwie do metody, o której wiadomo, że zawsze jest wykonywana synchronicznie do zakończenia, ale z jakiegoś powodu nadal zwraca Task), powinna mieć przyrostek „Async”. To jest wskazówka. Podstawowym celem nazewnictwa jest pokazanie konsumentowi funkcjonalności, że wywoływana metoda prawdopodobnie nie zakończy synchronicznie całej swojej pracy; oczywiście pomaga to również w przypadku, gdy funkcjonalność jest ujawniana zarówno przy użyciu metod synchronicznych, jak i asynchronicznych, tak że do ich rozróżnienia potrzebna jest różnica nazw. Sposób, w jaki metoda osiąga swoją asynchroniczną implementację, jest nieistotny dla nazewnictwa: czy async / await jest używane do uzyskania pomocy kompilatora, czy też typy i metody z System.Threading.Tasks są używane bezpośrednio (np. sol. TaskCompletionSource) nie ma tak naprawdę znaczenia, ponieważ nie ma to wpływu na podpis metody, jeśli chodzi o konsumenta metody.
Oczywiście zawsze są wyjątki od wytycznych. Najbardziej zauważalnym w przypadku nazewnictwa byłyby przypadki, w których racją bytu całego typu jest zapewnienie funkcjonalności zorientowanej na asynchronię, w którym to przypadku posiadanie Async na każdej metodzie byłoby przesadą, np. Metody na samym Task, które generują inne zadania .
Jeśli chodzi o metody asynchroniczne zwracające void, nie jest pożądane, aby znajdowały się w obszarze publicznym, ponieważ obiekt wywołujący nie ma dobrego sposobu na sprawdzenie, kiedy praca asynchroniczna została zakończona. Jeśli jednak musisz publicznie ujawnić metodę asynchroniczną zwracającą void, prawdopodobnie chcesz mieć nazwę, która będzie wskazywać, że praca asynchroniczna jest inicjowana, i możesz użyć tutaj sufiksu „Async”, jeśli ma to sens. Biorąc pod uwagę, jak rzadki powinien być ten przypadek, twierdzę, że to tak naprawdę decyzja indywidualna.
Mam nadzieję, że to pomoże, Steve
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 prostej Task
instancji i pozwolenie kompilatorowi na jego magię. Jeśli jednak chcesz mieć public async void
rozszerzenie , zalecamy dołączenie Async
. Inne async 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 a async void
, prawdopodobnie powinienem zmienić go na znak , async Task
aby dzwoniący mogli na niego poczekać, a następnie dołączyć Async
.