.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
?
Ответы
Ответ 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
, так как она ничего не ждет дома, поэтому для компилятора ничего не нужно переписывать.