- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有以下函数,它允许我传入一个对象并用返回数据(如果有)填充该对象。
我修改了该函数,使其可以异步调用。
public static async Task<MySqlDataReader> MySQLReturnReader(string sName, List<MySqlParameter> oParameters, Action<MySqlDataReader> fn)
{
using (MySqlConnection oConn = new MySqlConnection(MasterConn))
{
await oConn.OpenAsync();
using (MySqlCommand oMySqlCommand = new MySqlCommand(sName, oConn))
{
oMySqlCommand.CommandType = CommandType.StoredProcedure;
if (oParameters != null)
{
foreach (MySqlParameter oPar in oParameters)
{
oMySqlCommand.Parameters.Add(oPar);
}
}
oMySqlCommand.Connection.Open();
using (MySqlDataReader oReader = oMySqlCommand.ExecuteReaderAsync())
{
fn(oReader);
}
}
}
return;
}
我的类对象是这样的;
public class MyClass
{
public int Id {get;set;}
public string Name {get;set;}
...
}
函数可以这样调用
List<MyClass> oMyClassList = new List<MyClass>();
List<MySqlParameter> oParams = new List<MySqlParameter>();
List<int> Ids = new List<int>(500);
Ids.Add(1);
Ids.Add(2);
...
Ids.Add(499);
foreach(int Id in Ids)
{
MySQLReturnReader("SPCheck", oParams, oRes =>
{
while (oRes.Read())
{
MyClass oMyClass = new MyClass();
oMyClass.Id = Convert.ToInt32(oRes["Id"]);
oMyClass.Name = oRes["Name"].ToString();
}
oMyClassList.Add(oMyClass);
}
);
}
问题是我收到“无法将类型‘System.Threading.Tasks.Task’隐式转换为‘MySql.Data.MySqlClient.MySqlDataReader’”的编译错误。我哪里出错了?
我想以这种方式使用 ExecuteReaderAsync,因为调用的存储过程非常复杂并且更愿意并行运行请求。
最佳答案
在您的代码中,您有:
using (MySqlDataReader oReader = oMySqlCommand.ExecuteReaderAsync())
编译错误Cannot implicitly convert type 'System.Threading.Tasks.Task' to 'MySql.Data.MySqlClient.MySqlDataReader'
意味着你需要使用await
用于“解包”ExecuteReaderAsync
返回的任务的关键字:
using (MySqlDataReader oReader = await oMySqlCommand.ExecuteReaderAsync())
但是请注意,如果您使用的是官方 MySql.Data 包,则此调用实际上不会异步执行。 MySql.Data
连接器中的Async
方法不是异步的;它们阻塞网络 I/O,并且仅在数据库操作完成时返回。 (有关更详细的讨论,请参阅 this question and its top answer。)MySQL bug #70111在 MySQL 连接器中报告此问题。
要获得真正的异步数据库操作,您必须等到错误被修复,或者切换到不同的连接器。我一直在开发一个新的、完全异步的连接器,它应该是 MySql.Data 的直接替代品;要试用,请安装 MySqlConnector from NuGet ;它的source is at GitHub .
关于c# - 使用 ExecuteReaderAsync 时无法将类型 DbDataReader 隐式转换为 MySqlDataReader,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20053227/
我是一名优秀的程序员,十分优秀!