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构造函数。
我遇到了这个奇怪的问题(或者我认为我的大脑被烧毁了..)。虽然我 运行 来自任务外部的代码,但它工作正常,但是当我 运行 在 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构造函数。