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

swi*_*tor 96 c# asynchronous using-statement

我有一种情况,我正在async调用返回和IDisposable实例的方法.例如:

HttpResponseMessage response = await httpClient.GetAsync(new Uri("http://www.google.com"));
Run Code Online (Sandbox Code Playgroud)

现在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;
}
Run Code Online (Sandbox Code Playgroud)

例2

using(HttpResponseMessage response = await httpClient.GetAsync(new Uri("http://www.google.com")))
{
    await this.responseLogger.LogResponseAsync(response);

    return true;
}
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 94

是的,那应该没问题.

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

  • 异步等待,直到我们得到响应
  • 使用它并立即处理它

在第二种情况下,你说:

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

一个using在异步方法声明为"奇",该Dispose呼叫可以在不同的线程来收购了该资源的一个执行(取决于同步环境等),但它仍然会发生......假设你在等待的东西不断显示出来或失败,当然.(就像Dispose你的using语句包含对永不返回的方法的调用一样,你不会最终调用非异步代码.)

  • 谢谢乔恩.虽然大多数异步的东西对我来说仍然是伏都教,但是看到它与其他.net功能集成的频率并且正常工作是相当令人放心的 (4认同)