Ответы SLaks и Killercam хороши; Я подумал, что просто добавлю немного больше контекста.
Ваш первый вопрос, по сути, касается того, какие методы можно пометить async
.
Метод, отмеченный как async
может возвращать void
, Task
или Task<T>
. В чем разница между ними?
Можно Task<T>
ожидать возврата асинхронного метода, и когда задача завершится, он предложит T.
Может Task
ожидаться возвращаемый асинхронный метод, и когда задача завершится, запланировано ее продолжение.
void
Возвращения метод асинхронной не может ожидаться; это метод «выстрелил и забыл». Он работает асинхронно, и вы не можете сказать, когда это будет сделано. Это более чем немного странно; как говорит SLaks, обычно вы делаете это только при создании асинхронного обработчика событий. Событие запускается, обработчик выполняет; никто не собирается «ждать» задачи, возвращаемой обработчиком событий, потому что обработчики событий не возвращают задачи, и даже если бы они это сделали, какой код будет использовать задачу для чего-то? Обычно это не код пользователя, который в первую очередь передает управление обработчику.
Ваш второй вопрос в комментарии по существу касается того, что можно await
редактировать:
Какие методы можно использовать await
? Можно ли редактировать метод, возвращающий пустоту await
?
Нет, нельзя ожидать метода возврата void. Компилятор преобразует await M()
в вызов M().GetAwaiter()
, где GetAwaiter
может быть метод экземпляра или метод расширения. Ожидаемое значение должно быть таким, для которого вы можете получить ожидающего; очевидно, что метод, возвращающий пустоту, не дает значения, из которого вы можете получить ожидающего.
Task
Методы возврата могут производить ожидаемые значения. Мы ожидаем, что третьи стороны захотят создать свои собственные реализации Task
-подобных объектов, которые можно ожидать, и вы сможете их ожидать. Однако вы не сможете объявлять async
методы, возвращающие что-либо, кроме void
, Task
или Task<T>
.
(ОБНОВЛЕНИЕ: мое последнее предложение может быть фальсифицировано будущей версией C #; есть предложение разрешить типы возврата, отличные от типов задач, для асинхронных методов.)
(ОБНОВЛЕНИЕ: упомянутая выше функция вошла в C # 7.)