c# - 在 C# 中使用语句和 await 关键字可以很好地发挥作用

标签 c# asynchronous using-statement

我有这样一种情况,我正在对返回 IDisposable 实例的方法进行 async 调用。例如:

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;
}

最佳答案

是的,那应该没问题。

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

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

在第二种情况下,你是说:

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

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

关于c# - 在 C# 中使用语句和 await 关键字可以很好地发挥作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16566547/

相关文章:

c# - 在 .net ReportViewer 控件中查看 MS Access Report

c# - 以编程方式创建 sqlite 数据库(如果它不存在)?

c# - 如果对象是在 using 语句中创建的且未显式绑定(bind)到引用,则该对象是否符合垃圾回收条件?

C#/Informix : Do I need to explicitly call Close on my DB Connection if it's in a using statement?

c# - 如果我在使用语句结束之前调用 Dispose() 会发生什么?

c# - 处理 ObjectDataSource 异常的最佳方法是什么?

c# - 如何使用 Gekofx 浏览器使用 c# 调用 javascript 函数

C++ 奇怪的异步行为

c# - 在关闭表单之前停止线程

java - 在 Android 中等待多个回调