Каково соглашение для добавления суффиксов к именам методов с помощью "Async"?
Следует ли добавлять суффикс «Async» только к методу, объявленному с помощью async
модификатора?
public async Task<bool> ConnectAsync()
Или достаточно просто возврата метода Task<T>
или Task
?
public Task<bool> ConnectAsync()
c#
.net
async-await
naming-conventions
naming
касперхдж
источник
источник
Ответы:
Я думаю, правда неоднозначна даже из документации Microsoft:
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 говорится:
http://msdn.microsoft.com/en-us/library/hh191443.aspx#BKMK_NamingConvention
При этом даже не упоминается, что ваши собственные возвращаемые асинхронные методы
Task
нуждаются вAsync
суффиксе, с чем, я думаю, мы все согласны.Таким образом, ответ на этот вопрос может быть таким: оба. В обоих случаях вам нужно добавить
Async
к методамasync
ключевое слово и вернутьTask
илиTask<T>
.Я попрошу Стивена Туба прояснить ситуацию.
Обновить
Так я и сделал. А вот что написал наш добрый человек:
Краткое руководство из вступительного предложения Стивена достаточно ясно. Он исключает,
async void
потому что необычно создавать общедоступный API с таким дизайном, поскольку правильный способ реализации асинхронной пустоты - это вернуть простойTask
экземпляр и позволить компилятору использовать свою магию. Однако, если вы действительно хотитеpublic async void
,Async
рекомендуется добавить . Прочие вершины стекаasync void
методы такие как обработчики событий, обычно не являются общедоступными и не имеют значения / квалифицируются.Что касается меня, это говорит мне, что если я задаюсь вопросом о суффиксе
Async
вasync void
, мне, вероятно, следует превратить его в,async Task
чтобы вызывающие абоненты могли его ждать, а затем добавитьAsync
.источник
PersonString
илиPriceDecimal
так, зачем использоватьGetAsync
- API-потребители асинхронных API-интерфейсов не должны беспокоиться об этом, поскольку запрос всегда возвращается после завершения всех задач в любом случае. Это глупо и действительно меня раздражает. Но это просто еще одно соглашение, о котором никто не знает, почему он там.Я создаю множество API-сервисов и других приложений, которые вызывают другие системы, в которых большая часть моего кода выполняется асинхронно.
Мое собственное практическое правило, которому я следую:
Примеры:
Только один способ:
Тот же метод с двумя подписями:
Это имеет смысл, поскольку возвращаются одни и те же данные, но отличается только одно: только способ возврата данных , а не сами данные.
Я также думаю, что это соглашение об именах существует из-за необходимости ввести асинхронные методы и по-прежнему поддерживать обратную совместимость.
Я утверждаю, что в новом коде не следует использовать суффикс Async. Это так же очевидно, как возвращаемый тип String или Int, как упоминалось ранее в этом потоке.
источник
В основе задач Asynchronous Pattern (TAP) диктует , что методы всегда должны возвращать
Task<T>
(илиTask
) и быть названы с асинхронным суффиксом; это отдельно от использованияasync
. ОбаTask<bool> Connect()
и будут компилироваться и работать нормально, но вы не будете следовать соглашению об именах TAP.async
Task<bool> Connect()
Если тело метода (независимо от типа или имени возвращаемого значения) включает
await
, вы должны использоватьasync
; и компилятор сообщит вам: «Оператор 'await' может использоваться только в асинхронном методе ...». ВозвратаTask<T>
илиTask
недостаточно, чтобы избежать использованияasync
. Подробнее см. Async (Справочник по C #) .Оба и должным образом следуют соглашениям TAP. Вы всегда можете использовать ключевое слово, но вы получите предупреждение компилятора «В этом асинхронном методе отсутствуют операторы 'await' и он будет работать синхронно ...», если тело не использует .
async
Task<bool> ConnectAsync()
Task<bool> ConnectAsync()
async
await
источник
async
ключевое слово.async
- вторая часть вопроса.async
модификатор или нет . См. Также примеры OPpublic async Task<bool> ConnectAsync()
(сasync
модификатором) vspublic Task<bool> ConnectAsync()
(безasync
модификатора). Само имя метода в обоих случаях имеет суффикс «Async».Task
или методов, которые имеютasync Task
.Который.
async
Ключевое слово не является реальной проблемой здесь. Если вы реализуете асинхронность без использованияasync
ключевого слова, метод по-прежнему будет «асинхронным» в общем смысле.источник
Так
Task
иTask<T>
оба awaitable типа, они представляют собой некоторые асинхронные операции. Или, по крайней мере, они должны представлять.Вы должны добавить суффикс
Async
к методу, который в некоторых случаях (не обязательно во всех) не возвращает значение, а скорее возвращает оболочку для текущей операции. Обычно это оболочкаTask
, но в Windows RT она может бытьIAsyncInfo
. Следуйте своей интуиции и помните, что если пользователь вашего кода увидитAsync
функцию, он или она будет знать, что вызов этого метода не связан с результатом этого метода и что он должен действовать соответственно.Обратите внимание, что есть такие методы, как
Task.Delay
и,Task.WhenAll
которые возвращаются,Task
но не имеютAsync
суффикса.Также обратите внимание, что есть
async void
методы, которые представляют собой асинхронный метод « выстрелил и забыл», и вам лучше знать, что метод построен таким образом.источник
Я бы сказал, что он должен использовать суффикс Async, если он возвращает Task, независимо от того, объявлен метод с
async
модификатором или нет.Причина в том, что имя объявлено в интерфейсе. Интерфейс объявляет возвращаемый тип, которым является
Task
. Затем есть две реализации этого интерфейса: одна реализация реализует его с помощьюasync
модификатора, а другая - нет.источник
В разделе «Асинхронное программирование с использованием async и await (C #)» Microsoft предлагает следующие рекомендации:
Я считаю это руководство неполным и неудовлетворительным. Означает ли это, что при отсутствии
async
модификатора этот метод следует называтьConnect
вместоConnectAsync
?Я так не думаю. Как указано в кратком ответе по @Servy и более подробный ответ по @Luke Puplett , я считаю , что это уместно и в самом деле ожидать , что этот метод должен быть назван
ConnectAsync
(потому что она возвращает awaitable). В качестве дополнительной поддержки этого, @John Skeet в этом ответе на другой вопрос добавляетсяAsync
к имени метода независимо от наличияasync
модификатора.Наконец, еще один вопрос , рассмотреть этот комментарий по @Damien_The_Unbeliever :
Из этого я делаю вывод, что именно асинхронный характер метода определяет, как ему следует называть. Пользователь метода даже не узнает, используется ли
async
модификатор в его реализации (без исходного кода C # или CIL).источник