Зависит ли использование суффикса "Async" в имени метода от того, используется ли модификатор "async"?


каково Соглашение для суффиксов имен методов с "асинхронным"?

должен ли суффикс" асинхронный " быть добавлен только к методу, который объявлен с помощью async модификатор?

public async Task<bool> ConnectAsync()

или достаточно того, что метод просто возвращает Task<T> или Task?

public Task<bool> ConnectAsync()
7 63

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 является асинхронным, а затем его высказывание должно возвращать либо a Task или 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() { /* ... */ }
}