Используйте операторы и ждите, что ключевые слова хорошо играют в c#


у меня ситуация, когда я делаю async вызов метода, который возвращает и IDisposable экземпляра. Например:

HttpResponseMessage response = await httpClient.GetAsync(new Uri("http://www.google.com"));

теперь перед async был на сцене, когда работал с IDisposable экземпляр, этот вызов и код, который использовал переменную "response", будут обернуты в оператор using.

мой вопрос заключается в том, что все-таки правильный подход, когда async ключевое слово бросается в микс? Даже если код компилируется, будет ли использование заявление все еще работает, как ожидалось в обоих примерах ниже?

Пример 1

using(HttpResponseMessage response = await httpClient.GetAsync(new Uri("http://www.google.com")))
{
    // Do something with the response

    return true;
}

Пример 2

using(HttpResponseMessage response = await httpClient.GetAsync(new Uri("http://www.google.com")))
{
    await this.responseLogger.LogResponseAsync(response);

    return true;
}
1 84

1 ответ:

Да, это должно быть хорошо.

в первом случае вы действительно говорите:

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

во втором случае, вы говорите:

  • асинхронно ждать, пока мы не сможем получить ответ
  • асинхронно ждать, пока мы не вошли в ответ
  • распоряжаться ответ

A using оператор в асинхронном методе является "нечетным" в том, что Dispose вызов может выполняться в другом потоке, что приобретенный ресурс (в зависимости от контекста синхронизации и т. д.), Но это все равно произойдет... предполагая, что вы ждете когда-нибудь появляется или терпит неудачу, конечно. (Так же, как вы не будете в конечном итоге вызов Dispose в несинхронном коде, если ваш using оператор содержит вызов метода, который не возвращает.)