Зависит ли использование суффикса "Async" в имени метода от того, используется ли модификатор "async"?
каково Соглашение для суффиксов имен методов с "асинхронным"?
должен ли суффикс" асинхронный " быть добавлен только к методу, который объявлен с помощью async
модификатор?
public async Task<bool> ConnectAsync()
или достаточно того, что метод просто возвращает Task<T>
или Task
?
public Task<bool> ConnectAsync()
7 ответов:
я думаю, что правда неоднозначна даже из документации Microsoft:
в Visual Studio 2012 и .NET Framework 4.5, любой метод, который является списать с
async
ключевое слово (Async
в Visual Basic) является рассматривается асинхронный метод, а также C# и Visual Basic компиляторы выполняют необходимые преобразования для реализации метод асинхронно с помощью крана. Асинхронный метод должен возвращает либоTask
илиTask<TResult>
объект.http://msdn.microsoft.com/en-us/library/hh873177 (v=vs. 110). aspx
это уже не правильно. Любой метод с
async
является асинхронным, а затем его высказывание должно возвращать либо aTask
илиTask<T>
- что не подходит для методов в верхней части стека вызовов, например Button_Click илиasync void
.конечно, вы должны рассмотреть, в чем смысл конвенции?
можно сказать, что элемент
Async
соглашение суффикса должно сообщить пользователю API, что метод является ожидаемым. Чтобы метод был ожидаемым, он должен возвращатьTask
для пустоты, илиTask<T>
для метода возврата значения, что означает, что только последний может быть суффиксомAsync
.или вы могли бы сказать, что
Async
конвенция суффикс общаться, что метод может немедленно вернуться, отказавшись от текущего потока для выполнения другой работы и может привести к гонки.эта цитата Microsoft doc говорит:
по соглашению, вы добавляете "асинхронный" к именам методов, которые имеют Async или модификатор async.
http://msdn.microsoft.com/en-us/library/hh191443.aspx#BKMK_NamingConvention
который даже не упоминает, что ваши собственные асинхронные методы возвращают
Task
нужныAsync
суффикс, который я думаю, мы все согласны, что они делать.
так что ответ на этот вопрос может быть: как. В обоих случаях необходимо добавить
Async
для методов сasync
ключевое слово и возвращающихTask
илиTask<T>
.
я собираюсь попросить Стивена Тоуба прояснить ситуацию.
обновление
так я и сделал. И вот что написал наш добрый человек:
если открытый метод возвращает задачу и является асинхронным по своей природе (как в отличие от метода, который, как известно, всегда выполняется синхронно завершение, но все равно возвращает задачу по какой-то причине), она должна иметь суффикс" асинхронный". Это руководство. Основная цель здесь именование должно сделать его очень очевидным для потребителя функциональность, которую вызываемый метод, скорее всего, не завершит вся его работа синхронно; это, конечно, также помогает с делом где функциональность предоставляется как синхронно, так и асинхронно методы такие, что вам нужна разница в имени, чтобы отличить их. Как метод достигает своей асинхронной реализации несущественно именование: может ли асинхронный/ждут, используется, чтобы заручиться помощью компилятора , или ли типы и методы из системы.Нарезка резьбы.Используются задачи непосредственно (например, TaskCompletionSource) на самом деле не имеет значения, как это не влияет на сигнатуру метода, как потребителя заинтересованные метод.
конечно, всегда есть исключения к директива. Наиболее заметным в случае именования были бы случаи где смысл всего типа заключается в обеспечении асинхронной фокусировки функциональность, в этом случае наличие асинхронности для каждого метода будет перебор, например, методы на самой задаче, которые производят другие задачи.
что касается асинхронных методов void-returning, то не желательно иметь те, в общественной зоне поверхности, поскольку абонент не получилось зная, когда асинхронная работа завершена. Если вы должны разоблачить тем не менее, асинхронный метод с возвращением пустоты публично, вы, вероятно, делаете хотите иметь имя, которое передает, что асинхронная работа инициировано, и вы можете использовать суффикс "Async" здесь, если это имеет смысл. Учитывая, насколько редким должен быть этот случай, я бы сказал, что это действительно решение в каждом конкретном случае.
надеюсь, это поможет, Стив
краткое руководство из вступительного предложения Стивена достаточно ясно. Это исключает
async void
потому что необычно хотеть создать публичный API с таким дизайном, так как правильный способ реализации асинхронного void-это вернуть простойTask
экземпляр и пусть компилятор к своей магии. Однако, если вы действительно хотитеpublic async void
, затем добавивAsync
рекомендуется. Другие топ-оф-стекasync void
такие методы, как обработчики событий, обычно не являются общедоступными и не имеют значения/квалификации.для меня это говорит мне, что если я обнаружу, что мне интересно о суффиксе
Async
наasync void
, Я наверное, следует превратить его вasync Task
так что абоненты могут ждать его, а затем добавитьAsync
.
что такое Соглашение для суффиксов имен методов с "асинхронным".
The асинхронный шаблон на основе задач (TAP) диктует, что методы должны всегда возвращать a
Task<T>
(илиTask
) и с асинхронные суффикс; это отдельно от использованияasync
. ОбаTask<bool> Connect()
иasync
Task<bool> Connect()
будет компилироваться и работать просто отлично, но вы не будете следовать названию крана конвенция.если метод содержит
async
модификатор, или его достаточно, чтобы он просто возвращал задачу?если тело метода (независимо от возвращаемого типа или имени) включает
await
, вы должны использоватьasync
; и компилятор скажет вам "оператор' await ' может использоваться только в асинхронном методе. ...". ВозвращениеTask<T>
илиTask
не "достаточно", чтобы избежать использованияasync
. Смотрите асинхронный (C# Ссылка) для сведения.т. е. какая из этих подписей правильная:
и
async
Task<bool> ConnectAsync()
иTask<bool> ConnectAsync()
правильно следуйте условным обозначениям крана. Вы могли бы всегда использоватьasync
ключевое слово, но вы получите предупреждение компилятора "этот асинхронный метод не имеет операторов "await" и будет работать синхронно. ...- если тело не используетawait
.
или этого достаточно, чтобы он просто возвращал задачу?
что. Элемент
async
ключевое слово не является реальной проблемой здесь. Если вы реализуете асинхронность без использованияasync
ключевое слово метод по-прежнему" асинхронный", в общем смысле.
С
Task
иTask<T>
оба ожидаемых типа, они представляют некоторые асинхронная операция. Или, по крайней мере, они должны представлять.вы должны добавить суффикс
Async
к методу, который в некоторых случаях (не обязательно все) не возвращает значение, а скорее возвращает оболочку вокруг текущей операции. Эта обертка обычноTask
, но на Windows RT это может бытьIAsyncInfo
. Следуйте своей интуиции и помните, что если пользователь вашего кода видитAsync
функция, он или она будет знать, что вызов этого метода отделен от результата этого метода и что они должны действовать соответственно.обратите внимание, что существуют такие методы, как
Task.Delay
иTask.WhenAll
взаменTask
и нетAsync
суффиксом.также обратите внимание, что есть
async void
методов, которые представляют собой огонь и забыть асинхронный метод, и вы должны лучше знать, что метод построен таким путь.
Я создаю много API-сервисов и других приложений, которые вызывают другие системы, где большая часть моего кода работает асинхронно.
мое собственное эмпирическое правило я следую:
Если есть как не-асинхронный, так и асинхронный метод, который возвращает то же самое Я суффикс асинхронный с асинхронным. Иначе нет.
примеры:
только один способ:
public async Task<User> GetUser() { [...] }
тот же метод с двумя подписи:
public User GetUser() { [...] } public async Task<User> GetUserAsync() { [...] }
это имеет смысл, так как это те же данные, которые возвращаются, но единственное, что отличается способ возврата данных, а не сами данные.
Я также думаю, что эти соглашения об именах существуют из-за необходимости вводить асинхронные методы и по-прежнему поддерживать обратную совместимость.
Я утверждаю, что новый код не должен использовать асинхронный суффикс. Это так же очевидно, как возвращаемый тип строки или Int, как упоминалось ранее в эта тема.
на асинхронного программирования с async и await (C#и) Microsoft предлагает следующие рекомендации:
Соглашение Об Именах
по соглашению, вы добавляете "асинхронный" к именам методов, которые имеют асинхронные модификатор.
вы можете игнорировать соглашение, где событие, базовый класс или интерфейс контракт предполагает другое название. Например, вы не должны переименовывать общий обработчики событий, такие как
Button1_Click
.я нахожу это руководство неполным и неудовлетворительным. Значит ли это, что в отсутствие
async
модификатор, этот метод должен быть названConnect
вместоConnectAsync
?public Task<bool> ConnectAsync() { return ConnectAsyncInternal(); }
я так не думаю. Как указано в краткий ответ by @Servy и больше подробный ответ!--14-- > by @Luke Puplett, я считаю, что это уместно и даже ожидаемо вот этот метод должны (потому что он возвращает ожидаемый объект). В дальнейшем в поддержку этого, @John Skeet на ответ к другому вопросу прилагается
Async
к имени метода независимо от наличияasync
модификатор.наконец,еще вопрос, считать комментарий by @Damien_The_Unbeliever:
async/await
несколько реализация подробности ваших методов. Это имеет значение ни одной йоты, объявлен ли ваш методasync Task Method()
или простоTask Method()
, насколько ваш абоненты есть. (В тем, вы можете свободно переключаться между этими двумя в более поздний момент время не является критическим изменением.)из этого я делаю вывод, что это асинхронный характер метода что диктует, как он должен быть назван. Пользователь метод даже не будет знать, является ли
async
модификатор используется в его реализации (без исходного кода C# или CIL).
Я бы сказал, что он должен использовать асинхронный суффикс, если он возвращает задачу независимо от того, объявлен ли метод с помощью
async
модификатор.причиной этого является то, что имя объявляется в интерфейсе. Интерфейс объявляет тип возвращаемого значения, который является
Task
. То есть две реализации этого интерфейса, одна реализация реализует его с помощьюasync
модификатор, другой нет.public interface IFoo { Task FooAsync(); } public class FooA : IFoo { public Task FooAsync() { /* ... */ } } public class FooB : IFoo { public async Task FooAsync() { /* ... */ } }