【发布时间】:2016-09-23 13:11:12
【问题描述】:
我正在尝试使用 Task.WhenAll 执行多个 SqlDataReader。但是当等待任务时,我得到了
"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 执行时不应该打开数据库连接还是我遗漏了什么?
【问题讨论】:
-
您有两个连接。您在哪个连接上遇到错误?我会在 sqlCon.Open() 上设置一个断点,看看您的代码是否正在运行 [两次] 并且连接实际上正在打开。
-
一旦您的
ExecuteReaderAsync调用返回,您的连接将被关闭(正如它在using语句中声明的那样)。你的ExecuteReaderAsync调用返回before数据被读取(毕竟它是一个异步读取器!)。 -
连接被关闭是因为你因为return语句而退出了using块。你应该看看codereview.stackexchange.com/a/22916/54013
-
罗伯特在第二个(“GetSqlDataReader2”)
-
@AsusT9 你必须同时改变这个方法和调用者。调用者应该提供和控制连接。关闭连接后,您无法使用阅读器
标签: c# async-await sqldatareader