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

时间:2013-05-15 13:36:31

标签: c# asynchronous using-statement

我遇到的情况是我对返回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;
}

1 个答案:

答案 0 :(得分:90)

是的,那应该没问题。

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

  • 异步等到我们得到回复
  • 立即使用并立即处理

在第二种情况下,你说:

  • 异步等到我们得到回复
  • 异步等待我们记录响应
  • 处理回复

异步方法中的using语句是“奇怪的”,因为Dispose调用可以在与获取资源的线程不同的线程中执行(取决于同步上下文等)但它将仍然会发生...当然,假设你正在等待的事情显示或失败。 (就像你的Dispose语句包含对永不返回的方法的调用一样,你不会最终在非异步代码中调用using。)