Я думаю, що правда неоднозначна навіть з документації 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
.