使用语句和等待关键字在c#中很好地发挥

我有一个情况,我正在进行一个方法返回和IDisposable实例的async调用。 例如:

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

现在async在现场之前,在使用IDisposable实例时,使用“响应”variables的这个调用和代码将被包装在using语句中。

我的问题是,当async关键字被混入时,这是否仍然是正确的方法? 即使代码编译,在下面的例子中,using语句是否仍然按照预期工作?

例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; } 

是的,那应该没问题。

在第一种情况下,你真的在​​说:

  • asynchronous等待,直到我们可以得到响应
  • 使用它并立即处理它

在第二种情况下,你说:

  • asynchronous等待,直到我们可以得到响应
  • asynchronous等待直到我们logging了响应
  • 处理响应

asynchronous方法中的using语句是“奇怪的”,因为Dispose调用可能会在不同的线程中执行到获取资源的线程(取决于同步上下文等),但它仍然会发生…假设你是当然,等待出现或失败。 (就像你不会在非asynchronous代码中调用Dispose ,如果你的using语句包含对永不返回的方法的调用)。