108

我有一种情况,我正在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;
}
4

1 回答 1

104

是的,那应该没问题。

在第一种情况下,您实际上是在说:

  • 异步等待,直到我们可以得到响应
  • 立即使用并丢弃

在第二种情况下,你说:

  • 异步等待,直到我们可以得到响应
  • 异步等待,直到我们记录了响应
  • 处理响应

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

于 2013-05-15T13:38:44.180 回答