微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

NUnit - 任务中的 SqlConnection 超时

如何解决NUnit - 任务中的 SqlConnection 超时

我遇到了这个奇怪的问题(或者我认为我的大脑被烧毁了..)。当我从 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() 返回 IDbConnection。

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

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

我使用的是 .NET Framework 4.5 和 sql Server 2012。

临时解决方案: 好吧,我浪费了将近 6 个小时试图找出问题所在……这是 NUnit。从测试运行 GetItemasynctest() 时,它会引发超时异常。从控制器运行相同的异步方法就像一个魅力。

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

谢谢!!

解决方法

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。