【问题标题】:Do using statements and await keywords play nicely in c#在 c# 中使用语句和等待关键字可以很好地发挥作用
【发布时间】:2013-05-10 02:43:18
【问题描述】:

我有一种情况,我正在对一个返回的方法和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;
}

【问题讨论】:

    标签: c# asynchronous using-statement


    【解决方案1】:

    是的,应该没问题。

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

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

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

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

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

    【讨论】:

    • 谢谢乔恩。虽然大多数异步内容对我来说仍然是巫术,但看到它与其他 .net 功能集成的频率并正常工作,这让我很放心
    • @JonSkeet 是否应该在 using(){...} 块内使用 await 或者它是一种矫枉过正或在某些情况下可能会降低性能? using(){...}await 的用途相同吗?
    • @nam:不,usingawait 的用途完全不同。请注意,C# 8 现在也具有异步处理功能。虽然值得了解我的回答强调的线程问题,但这绝对不意味着混合usingawait错误
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多