【问题标题】:C# 8 understanding await using syntax [duplicate]C# 8 理解 await 使用语法 [重复]
【发布时间】:2020-03-06 14:01:32
【问题描述】:

我有下一个方法:

public async Task<IEnumerable<Quote>> GetQuotesAsync()
{
    using var connection = new SqlConnection(_connectionString);

    var allQuotes = await connection.QueryAsync<Quote>(@"SELECT [Symbol], [Bid], [Ask], [Digits] FROM [QuoteEngine].[RealtimeData]");

    return allQuotes;
}

一切都很好,很清楚,连接将在范围结束时处理。

但 resharper 建议将其更改为:

public async Task<IEnumerable<Quote>> GetQuotesAsync()
{
    await using var connection = new SqlConnection(_connectionString);

    var allQuotes = await connection.QueryAsync<Quote>(@"SELECT [Symbol], [Bid], [Ask], [Digits] FROM [QuoteEngine].[RealtimeData]");

    return allQuotes;
}

在使用前添加await,代码编译成功。这是什么意思,我们什么时候需要这样做?

【问题讨论】:

    标签: c# async-await resharper using c#-8.0


    【解决方案1】:

    类似于using (...) 使用IDisposable 清理资源,await using (...) 使用IAsyncDisposable。 这允许在清理时执行耗时的任务(例如涉及 I/O)而不会阻塞。

    【讨论】:

    • 非常简洁明了的答案,但我猜你的意思是IDisposable,而不是IDispose
    • 谢谢您 - 已更正。
    【解决方案2】:

    如果SqlConnection实现了IAsyncDisposable接口,Resharper建议你切换到await using使用DisposeAsyncmethod异步处理它

    public interface IAsyncDisposable
    {
        ValueTask DisposeAsync();
    }
    

    【讨论】:

      猜你喜欢
      • 2018-04-01
      • 2019-03-04
      • 2017-11-23
      • 2018-10-29
      • 2019-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多