Асинхронизация и ожидание могут быть исключены? - PullRequest
0 голосов
/ 09 июля 2019

У меня есть этот простой код:

 public async  Task<string> GetAsync()
   {
      var httpClient = new HttpClient();
      return await httpClient.GetStringAsync("...");
   }

Однако Решарпер говорит:

enter image description here

Это предупреждение исчезает, когда я использую переменную:

 public async  Task<string> GetAsync()
        {
            var httpClient = new HttpClient();
            var st = await  httpClient.GetStringAsync("...");
            return st;
        }

Я уже знаю опасность при выполнении

 using (var httpClient = new HttpClient())
 return  httpClient.GetStringAsync("...");

(задание будет отменено)

Но это не мой случай, поскольку я использую await (а не using).

Вопрос:

Почему Решарпер предупреждает меня?

1 Ответ

0 голосов
/ 09 июля 2019

Ваш метод «можно» переписать следующим образом:

public Task<string> GetAsync()
{
    var httpClient = new HttpClient();
    return httpClient.GetStringAsync("...");
}

, что позволяет избежать затрат на компиляцию метода async и затем выполнить дорогостоящее переключение потока управления с await. Функциональность все та же. Об этом говорит R # - вы можете опустить async/await и избежать ненужных накладных расходов.

Тем не менее, я помещаю «can» в кавычки, так как ваш код вонючий, потому что, прежде всего, HttpClient - это IDisposable, поэтому вы должны утилизировать его после использования. Тогда async/await будет необходимо:

public async Task<string> GetAsync()
{
    using(var httpClient = new HttpClient())
    {
        return await httpClient.GetStringAsync("...");
    }
}

так как это будет переведено в эквивалент

public async Task<string> GetAsync()
{
    var httpClient = new HttpClient();
    var result = await httpClient.GetStringAsync("...");
    httpClient.Dispose();
    return result;
}

Это тот, который вы обязательно должны исправить. Во-вторых, следует учитывать, что создание HttpClient s может незаметно дестабилизировать ваше приложение, так как HttpClient s следует использовать повторно. См. это сообщение в блоге и это сообщение SE Stack Exchange .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...