Я думаю, правда неоднозначна даже из документации 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
значение void или Task<T>
метод, возвращающий значение, что означает, что только последний может иметь суффикс Async
.
Или вы можете сказать, что Async
суффиксное соглашение заключается в том, чтобы сообщить, что метод может немедленно вернуться, отказываясь от текущего потока для выполнения другой работы и потенциально вызывая гонки.
В этой цитате из документа Microsoft говорится:
По соглашению вы добавляете «Async» к именам методов, которые имеют модификатор Async или async.
http://msdn.microsoft.com/en-us/library/hh191443.aspx#BKMK_NamingConvention
При этом даже не упоминается, что ваши собственные возвращаемые асинхронные методы Task
нуждаются в Async
суффиксе, с чем, я думаю, мы все согласны.
Таким образом, ответ на этот вопрос может быть таким: оба. В обоих случаях вам нужно добавить Async
к методам async
ключевое слово и вернуть Task
или Task<T>
.
Я попрошу Стивена Туба прояснить ситуацию.
Обновить
Так я и сделал. А вот что написал наш добрый человек:
Если общедоступный метод является возвращающим Task и является асинхронным по своей природе (в отличие от метода, который, как известно, всегда выполняется синхронно до завершения, но по какой-то причине все еще возвращает Task), он должен иметь суффикс «Async». Это руководство. Основная цель здесь при именовании - сделать очевидным для потребителя функциональности, что вызываемый метод, скорее всего, не завершит всю свою работу синхронно; это, конечно, также помогает в случае, когда функциональность предоставляется как с синхронными, так и с асинхронными методами, так что вам нужно различать имена, чтобы различать их. То, как метод достигает своей асинхронной реализации, не имеет значения для именования: используется ли async / await для получения справки компилятора или типы и методы из System.Threading.Tasks используются напрямую (например, грамм. TaskCompletionSource) на самом деле не имеет значения, поскольку это не влияет на сигнатуру метода с точки зрения потребителя метода.
Конечно, из правил всегда есть исключения. Наиболее заметным в случае именования будут случаи, когда смысл существования всего типа заключается в предоставлении асинхронно-ориентированной функциональности, и в этом случае наличие Async для каждого метода было бы излишним, например, методы самой задачи, которые создают другие задачи .
Что касается асинхронных методов с возвратом пустоты, нежелательно иметь их в общедоступной области, так как вызывающий не имеет надежного способа узнать, когда асинхронная работа завершена. Однако, если вы должны публично раскрыть асинхронный метод, возвращающий пустоту, вы, вероятно, захотите иметь имя, которое передает, что асинхронная работа инициируется, и вы можете использовать здесь суффикс «Async», если это имеет смысл. Учитывая, насколько редким должен быть этот случай, я бы сказал, что это действительно индивидуальное решение.
Надеюсь, это поможет, Стив
Краткое руководство из вступительного предложения Стивена достаточно ясно. Он исключает, async void
потому что необычно создавать общедоступный API с таким дизайном, поскольку правильный способ реализации асинхронной пустоты - это вернуть простой Task
экземпляр и позволить компилятору использовать свою магию. Однако, если вы действительно хотите public async void
, Async
рекомендуется добавить . Прочие вершины стекаasync void
методы такие как обработчики событий, обычно не являются общедоступными и не имеют значения / квалифицируются.
Что касается меня, это говорит мне, что если я задаюсь вопросом о суффиксе Async
в async void
, мне, вероятно, следует превратить его в, async Task
чтобы вызывающие абоненты могли его ждать, а затем добавить Async
.