NUnit - 任务中的 SqlConnection 超时

NUnit - SqlConnection timeout within Task

我遇到了这个奇怪的问题(或者我认为我的大脑被烧毁了..)。虽然我 运行 来自任务外部的代码,但它工作正常,但是当我 运行 在 Task.Run(() => ...) 内时,我得到一个 SqlException 超时:

public static Item GetItemById(int id)
{
    Item result;

    using (var conn = App.DbFactory.CreateConnection())
    {
         result = _repository.GetById(id, conn) ?? throw new ElementNotFoundException();
    }
    
    return result;
}

// _repository.GetById
public Item GetById(int id, IDatabaseConnection conn)
{
     Item result;
        
     var cmd = conn.CreateCommand();
     cmd.CommandText = "QUERY COMMAND";

     using (var dr = cmd.ExecuteReader()) <-- EXCEPTION
     {
          result = dr.Read() ? Create(dr) : null;
     }

     return result;
}


// Method that works.
public static Item GetItemTest()
{
    return GetItemById(12);
}

// Method that doesn't work.
public static async Item GetItemAsyncTest()
{
    return await Task.Run(() => GetItemById(12));
}

App.DbFactory.CreateConnection() returns IDbConnection.

更新:执行DbCommand(ExecuteReader)时抛出异常

GeyById 方法仅调用存储库方法(原始 TSQL 查询)。调用者方法应该从 foreach 中读取数据库中的每个项目(使用 Task/async/await,不超过 5 个并发连接)。在这一点上,我不知道是我做错了什么还是我错过了一些概念。

我正在使用 .NET Framework 4.5 和 SQL Server 2012。

临时解决方案: 好吧,我浪费了将近 6 个小时试图弄清楚哪里出了问题……是 NUnit。 运行从测试中调用 GetItemAsyncTest() 时,它会抛出超时异常。 运行 来自 Controller 的相同异步方法非常有效。

我正在谷歌搜索这件事。如果有人有同样的问题,我会很高兴知道它是什么:)

谢谢!!

嗯,终于解决了!这是 NUnit 和 TransactionScope 之间的变通方法。使用 TransactionScope(以保持数据库清洁)测试命中数据库的异步方法会导致执行命令时出现超时异常。

解决此问题的方法是:升级到 NET Framework 4.5.1 并将 TransactionScopeAsyncFlowOption.Enabled 添加到 TransactionScope构造函数。