我正在尝试使用 Task.WhenAll 执行多个 SqlDataReaders。但是当任务等待时我得到
“System.InvalidOperationException:无效操作。连接
关闭了”。
创建任务:
List<Task<SqlDataReader>> _listTasksDataReader = new List<Task<SqlDataReader>>();
_listTasksDataReader.Add(GetSqlDataReader1(10));
_listTasksDataReader.Add(GetSqlDataReader2(10));
SqlDataReader[] _dataReaders = await Task.WhenAll(_listTasksDataReader);
我的“SqlDataReader”方法:
public Task<SqlDataReader> GetSqlDataReader1(int recordCount)
{
using (var sqlCon = new SqlConnection(ConnectionString))
{
sqlCon.Open();
using (var command = new SqlCommand("sp_GetData", sqlCon))
{
command.Parameters.Clear();
command.Parameters.Add(new SqlParameter("@recordCount", recordCount));
command.CommandType = System.Data.CommandType.StoredProcedure;
return command.ExecuteReaderAsync();
}
}
}
执行 Task.WhenAll 时不应该打开数据库连接还是我遗漏了什么?
可以将 CommandBehavior.CloseConnection 传递给 ExecuteReaderAsync。然后连接将保持打开状态,直到返回的 datareader 对象关闭:参见 MSDNhere https://msdn.microsoft.com/en-us/library/hh204867(v=vs.110).aspx and here https://msdn.microsoft.com/en-us/library/system.data.commandbehavior(v=vs.110).aspx。在这种情况下,SqlConnection 不需要位于using
陈述。
像这样:
public Task<SqlDataReader> GetSqlDataReader1(int recordCount)
{
var sqlCon = new SqlConnection(ConnectionString);
sqlCon.Open();
using (var command = new SqlCommand("sp_GetData", sqlCon))
{
command.Parameters.Clear();
command.Parameters.Add(new SqlParameter("@recordCount", recordCount));
command.CommandType = System.Data.CommandType.StoredProcedure;
return command.ExecuteReaderAsync(CommandBehavior.CloseConnection);
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)