Я думаю, що правда неоднозначна навіть з документації Microsoft:
У Visual Studio 2012 та .NET Framework 4.5 будь-який метод, який приписується asyncключовому слову ( Asyncу Visual Basic), вважається асинхронним методом, і компілятори C # і Visual Basic виконують необхідні перетворення для реалізації методу асинхронно за допомогою TAP. Асинхронний метод повинен повертати Taskабо Task<TResult>об’єкт.
http://msdn.microsoft.com/en-us/library/hh873177(v=vs.110).aspx
Це вже не правильно. Будь-який метод з asyncасинхронним, і тоді, за його словами, він повинен повертати Taskабо Task<T>-, що не підходить для методів у верхній частині стека викликів, наприклад Button_Click, або async void.
Звичайно, ви повинні врахувати, який сенс конвенції?
Можна сказати, що Asyncумова суфікса полягає в тому, щоб повідомити користувачеві API про те, що метод очікується. Щоб метод був очікуваним, він повинен повернутися Taskдля недійсності або Task<T>для методу повернення значення, а це означає, що лише останній може мати суфікс Async.
Або ви можете сказати, що Asyncумова суфікса полягає в повідомленні про те, що метод може повернутися негайно, відмовившись від поточного потоку для виконання інших робіт і, можливо, спричинивши перегони.
Ця цитата Microsoft doc говорить:
За умовою ви додаєте "Async" до імен методів, які мають модифікатор Async або async.
http://msdn.microsoft.com/en-us/library/hh191443.aspx#BKMK_NamingConvention
Що навіть не згадує, що для власних асинхронних методів повернення Taskпотрібен Asyncсуфікс, що, на мою думку, ми всі згодні.
Тож відповідь на це питання могла бути: і те, і інше. В обох випадках вам потрібно додати Asyncметоди з asyncключовим словом і повернути Taskабо Task<T>.
Я попрошу Стівена Туба прояснити ситуацію.
Оновлення
Так я і зробив. А ось що написав наш добрий чоловік:
Якщо загальнодоступний метод є поверненням завдань і має асинхронний характер (на відміну від методу, який, як відомо, завжди виконується синхронно до завершення, але все-таки повертає Завдання з якоїсь причини), він повинен мати суфікс "Асинхронізація". Ось такий настанов. Основна мета тут при іменуванні - зробити його очевидним для споживача функціональності, що метод, який використовується, швидше за все, не завершить всю свою роботу синхронно; це, звичайно, також допомагає у випадку, коли функціональність піддається як синхронним, так і асинхронним методам таким чином, що вам потрібна різниця імен для їх розрізнення. Те, як метод досягає своєї асинхронної реалізації, не має значення для іменування: чи використовується async / await для отримання допомоги компілятора, чи використовуються типи та методи з System.Threading.Tasks безпосередньо (наприклад, г. TaskCompletionSource) насправді не має значення, оскільки це не впливає на підпис методу, що стосується споживача методу.
Звичайно, завжди є винятки з настанови. Найбільш помітним у випадку іменування були б випадки, коли raison d'etre цілого типу - це надання функціоналу, орієнтованого на асинхронізацію, і в цьому випадку, якщо матиме Async на кожному методі, було б надмірним, наприклад, методами самої задачі, які виробляють інші завдання .
Що стосується асинхронних методів, що повертаються до недійсності, не бажано, щоб вони були на публічній поверхні, оскільки абонент не має хорошого способу знати, коли асинхронна робота завершена. Якщо ви повинні відкрити асинхронний метод, що повертається до недійсності, публічно, ви, ймовірно, хочете мати ім’я, яке передає, що асинхронна робота ініціюється, і ви можете використовувати суфікс "Асинхроніка" тут, якщо це має сенс. З огляду на те, наскільки рідкісним має бути цей випадок, я можу стверджувати, що це дійсно конкретні рішення.
Я сподіваюся, що це допоможе, Стів
Короткий вказівник із вступного речення Стівена досить чіткий. Це виключає, async voidоскільки незвично бажати створювати публічний API з таким дизайном, оскільки правильним способом реалізації асинхронної пустоти є повернення простого Taskекземпляра та дозволення компілятору до його магії. Однак якщо ви цього хотіли public async void, Asyncрекомендується додавати . Інші async voidметоди топ-стека, такі як обробники подій, зазвичай не є загальнодоступними і не мають значення / не відповідають умовам.
Для мене це говорить про те, що якщо мені здається, що я задаюся питанням про суфікс Asyncна async void, я, мабуть, повинен перетворити його на async Taskте, щоб абоненти могли його чекати, а потім додати Async.