Зависит ли использование суффикса "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()иasyncTask<bool> Connect()будет компилироваться и работать просто отлично, но вы не будете следовать названию крана конвенция.если метод содержит
asyncмодификатор, или его достаточно, чтобы он просто возвращал задачу?если тело метода (независимо от возвращаемого типа или имени) включает
await, вы должны использоватьasync; и компилятор скажет вам "оператор' await ' может использоваться только в асинхронном методе. ...". ВозвращениеTask<T>илиTaskне "достаточно", чтобы избежать использованияasync. Смотрите асинхронный (C# Ссылка) для сведения.т. е. какая из этих подписей правильная:
и
asyncTask<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() { /* ... */ } }