Задать вопрос
@hax
junior developer

Как правильно возвращать объект из async метода в .NET?

Всем привет! Есть вопрос по реализации async/await в .NET.

Приведу два примера:

1.
private Config _config;
private Config _defaultConfig => Config.GetDefaultConfig();

public async Task<Config> GetConfigAsync()
{
   if (_config == null)
   {
      return _defaultConfig; 
   }

   return await GetWebConfig("http://test.com");
}


Если выполнится условие в блоке if, то из метода GetConfigAsync будет возвращён объект типа Task.
Правильно ли оставлять в таком виде или лучше будет написать return await Task.FromResult(_defaultConfig)?

2.
public async Task<string> GetRequestResult()
{
   var response = await GetResponseFromUrl(url);

   if (response.isSuccess)
   {
      return "Success!";
   }
   else
   {
      return "Error!";
   }
}


В данном примере мне нужно просто проверить статус ответа от сервера. Если я помещу всё это в async Task, то при вызове метода GetRequestResult придётся писать await. Есть ли способ избежать этого? Нужно ли return оборачивать в Task.FromResult("Success")? Какие best-practice лучше применить? Уместен ли вариант с .Result в данном случае?
  • Вопрос задан
  • 260 просмотров
Подписаться 1 Простой Комментировать
Решения вопроса 1
@kttotto
пофиг на чем писать
1. У Вас корректные примеры, никаких await Task.FromResult не нужно.
2.
при вызове метода GetRequestResult придётся писать await

Придется. async/await заразен, он вынуждено подымается вверх по вызовам. С с .Result Вы убьете асинхронность, сомневаюсь, что в Ваше случае есть необходимость в его применении.

Бест практика одна - использовать его как будто это обычный метод, в этом и красота его применения. await перед вызовом говорит только, что вызывающий поток освободится. Ну и нужно помнить о контексте синхронизации и понимать когда можно сделать .ConfigureAwait(false).
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы