Ответы 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.)