Используйте операторы и ждите, что ключевые слова хорошо играют в 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 ответ:
Да, это должно быть хорошо.
в первом случае вы действительно говорите:
- асинхронно ждать, пока мы не сможем получить ответ
- используйте его и немедленно избавьтесь от него
во втором случае, вы говорите:
- асинхронно ждать, пока мы не сможем получить ответ
- асинхронно ждать, пока мы не вошли в ответ
- распоряжаться ответ
A
using
оператор в асинхронном методе является "нечетным" в том, чтоDispose
вызов может выполняться в другом потоке, что приобретенный ресурс (в зависимости от контекста синхронизации и т. д.), Но это все равно произойдет... предполагая, что вы ждете когда-нибудь появляется или терпит неудачу, конечно. (Так же, как вы не будете в конечном итоге вызовDispose
в несинхронном коде, если вашusing
оператор содержит вызов метода, который не возвращает.)