使用语句和等待关键字在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
语句包含对永不返回的方法的调用)。