Подтвердить что ты не робот

.NET 4.5 async ожидает и перегружает методы

У меня есть метод async:

public async Task<UserLoginExResult> LoginExAsync(CustomTable exRequest, string language, bool throwEx = true)
{
    UserLoginExResult result = await UserService.LoginExAsync(UserGroup, language, TimezoneOffset, GetDeviceInfo(), GetLoginProperties(), exRequest);

    ProcessLoginResult(result, false, throwEx);

    return result;
}

И перегрузка:

public Task<UserLoginExResult> LoginExAsync(CustomTable exRequest, bool throwEx = true)
{
    return LoginExAsync(exRequest, Language.ID, throwEx);
}

Я не уверен, следует ли отмечать перегруженный (с меньшим количеством параметров) как async и использовать await? Наверное, я не должен, но могу ли ты сказать мне, что произойдет, если я это сделаю? Я совсем потерялся здесь и не совсем уверен, что Task он будет ждать? Создаст ли дополнительный Task или await не создаст новый Task?

4b9b3361

Ответ 1

Нет, мало пользы от использования метода async, когда он просто собирается обернуть и развернуть существующий. Хорошо, что здесь есть "обычный" метод, делегирующий "реальный" асинхронный метод.

(Они не совсем одинаковы - например, если метод UserService.LoginExAsync выдает исключение, а не возвращает неудачную задачу, версия async/await будет просто возвращать неудачную задачу, тогда как другая версия также будет выдавать немедленно.)

Ответ 2

Ключевое слово async включает ключевое слово await. В вашем случае вы можете напрямую вернуть Task, поэтому нет необходимости в ключе async. async будет только добавлять служебные данные без добавления каких-либо значений.

Для получения дополнительной информации см. Стивен Туб Дзэн из асинхронных разговоров. Он напрямую обращается к этой ситуации.

Ответ 3

Это было бы действительно полезно, если бы вы выполняли дополнительную работу в своей перегрузке, например.

public async Task<UserLoginExResult> LoginExAsync(CustomTable exRequest, bool throwEx = true)
{
    Task<UserLoginExResult> result = await LoginExAsync(exRequest, Language.ID, throwEx);

    //Do some work here that depends on the result from the task completeion

    return result;
}

Но так как вы этого не сделаете, это не так!

Ответ 4

Перегрузка не должна быть помечена как async, так как она ничего не ждет дома, поэтому для компилятора ничего не нужно переписывать.