【问题标题】:top level await using causes interesting exception顶层等待使用导致有趣的异常
【发布时间】:2022-12-19 13:57:43
【问题描述】:

在调试会话中,我看到在没有上下文的情况下抛出异常(“名称 ex 在当前上下文中不存在”)但是在它从 try 块返回值之后

代码看起来像这样

public async Task<int> SomeHandler(){
    await using var connection = await _sqlConnectionFactory.CreateConnectionAsync();

    try
    {
        const string sql ="..."

        var sqlParams = new
        {
            ...
        };

        var r = await connection.ExecuteScalarAsync<int>(sql, sqlParams);

 1. ->  return r; //first returns

    }
    catch (Exception ex)
    {
 2. ->  throw new Exception("log message", ex); // Debugger hits and my QuickWatch says 'the name ex does not exist in the current context'
    }
}

CreateConnectionAsync 是“一路向下”的异步,SomeHandler 也被称为 async'ly。

然后我读了这个

“您可以实例化资源对象,然后将变量传递给 using 语句,但这不是最佳实践。在这种情况下,在控制离开 using 块后,该对象仍然在范围内,但可能无法访问其非托管资源。”

因此,只是为了它,我尝试在 using 中建立连接。

像这样

var connection = await _sqlConnectionFactory.CreateConnectionAsync();

await using (connection) {
    try {
       ....

异常仍在被“捕获”但仍然没有上下文(名称 ex 在当前上下文中不存在)

然后我尝试了两种不同的东西。

  1. await using var connection = await _sqlConnectionFactory.CreateConnectionAsync(); 放入我的 try 块中 - 然后异常消失了

  2. 在我的使用中删除了等待,这也导致异常消失了。

     var connection = await _sqlConnectionFactory.CreateConnectionAsync();
    
     using (connection) {
           try { 
    

    我对抛出的这个异常的解释是,它来自尝试处置时超出范围的数据库连接。

    我在这里走错路了吗?

【问题讨论】:

  • 我建议看一下连接类的 DisposeAsync 方法
  • 所以这只发生在附加调试器的情况下?换句话说用 Cltr+F5 运行绝对没有问题?
  • @theemee 连接是 SqlConnection。它继承自实现 IAsyncDisposable 的 DbConnection。
  • @TheodorZoulias 是的。似乎真的没有例外,但我可以通过如上所述移动代码来激发它。所以我想是不是出了什么问题? :/
  • SqlConnection 文档还建议使用 using 而不是 await using,所以我想这就是你应该使用的

标签: c# async-await


【解决方案1】:

我查看了 SqlConnection 和 DbConnection 的源代码。 DisposeAsync 仅调用同步 Dispose 方法,然后调用 return new ValueTask()。因此,在这种情况下,使用非异步 Dispose 不会丢失任何内容。

SqlConnection 文档还建议使用 using 而不是 await using,所以我想这就是你应该使用的

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-18
    • 2016-10-20
    • 2013-10-15
    相关资源
    最近更新 更多