Відповіді 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.)