我遇到的情况是我对返回async
实例的方法进行IDisposable
调用。例如:
HttpResponseMessage response = await httpClient.GetAsync(new Uri("http://www.google.com"));
现在async
在场景之前,当使用IDisposable
实例时,使用“response”变量的这个调用和代码将被包装在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;
}
答案 0 :(得分:90)
是的,那应该没问题。
在第一种情况下,你真的在说:
在第二种情况下,你说:
异步方法中的using
语句是“奇怪的”,因为Dispose
调用可以在与获取资源的线程不同的线程中执行(取决于同步上下文等)但它将仍然会发生...当然,假设你正在等待的事情显示或失败。 (就像你的Dispose
语句包含对永不返回的方法的调用一样,你不会最终在非异步代码中调用using
。)