Відповіді SLaks та Killercam хороші; Я думав, що просто додам трохи більше контексту.
Ваше перше питання - це, по суті, про те, які методи можна позначити async.
Метод, позначений як asyncможе повернутися void, Taskабо Task<T>. Які відмінності між ними?
Метод Task<T>повернення асинхронізації можна чекати, і коли завдання буде виконано, він відкриє T.
TaskПовернення метод асинхронної може очікуватися, і коли завершується завдання, продовження завдання планується запустити.
Метод voidповернення асинхронізації не можна чекати; це метод "пожежі та забудь". Це працює асинхронно, і у вас немає способу сказати, коли це робиться. Це більш ніж трохи дивно; як каже SLaks, ви зазвичай робите це лише при створенні асинхронного обробника подій. Подія запускається, обробник виконує; ніхто не збирається "чекати" завдання, поверненого обробником події, оскільки обробники подій не повертають завдання, і навіть якщо вони це зробили, який код використовував би завдання для чогось? Зазвичай це не код користувача, який передає керування обробнику в першу чергу.
Ваше друге запитання, в коментарі, по суті стосується того, що можна awaitредагувати:
Які методи можна awaitредагувати? Чи можна змінити метод повернення недійсності await?
Ні, методу повернення недійсності не можна чекати. Компілятор перекладається await M()на виклик M().GetAwaiter(), де GetAwaiterможе бути метод екземпляра або метод розширення. Очікувана цінність повинна бути такою, за яку можна отримати офіціанта; Очевидно, що метод, що повертає недійсність, не дає значення, з якого можна отримати офіціанта.
Task-прийоми повернення можуть давати очікувані значення. Ми передбачаємо, що треті сторони захочуть створити власні реалізації Taskоб’єктів -подібних, яких можна чекати, і ви зможете їх чекати. Однак вам не дозволять оголошувати asyncметоди, що повертають що-небудь, крім void, Taskабо Task<T>.
(ОНОВЛЕННЯ: Моє останнє речення там може бути сфальсифіковано майбутньою версією C #; є пропозиція дозволити типи повернення, крім типів завдань, для методів асинхронізації.)
(ОНОВЛЕННЯ: Згадана вище функція перетворила її на C # 7.)