我有一个通用读取器,我想将它从同步转换为异步。
原始代码为
while (DR.Read())
{
count++;
Field[] fields = new Field[DR.FieldCount];
for (int i = 0; i < DR.FieldCount; i++)
{
Field field = new Field();
field.RowCount = count;
field.FieldCount = i;
field.Name = DR.GetName(i);
field.DataType = DR.GetDataTypeName(i);
// decimal overflow workaround
field.ObjValue =
field.DataType == "Decimal"?
DR.GetDouble(i) :
DR.GetValue(i);
fields[i] = field;
}
yield return fields;
}
而且还可以。我试图做的是
List<Field[]> ret = new List<Field[]>();
while (await DR.ReadAsync())
{
count++;
Field[] fields = new Field[DR.FieldCount];
for (int i = 0; i < DR.FieldCount; i++)
{
Field field = new Field();
field.RowCount = count;
field.FieldCount = i;
field.Name = DR.GetName(i);
field.DataType = DR.GetDataTypeName(i);
// decimal overflow workaround
field.ObjValue =
field.DataType == "Decimal" ?
((object)await DR.GetFieldValueAsync<double>(i)) :
((object)await DR.GetFieldValueAsync(i));
fields[i] = field;
}
ret.Add(fields);
}
由于错误CS0411 而无法工作
方法"
GetFieldValueAsync
"的类型参数不能为根据用法推断。请尝试显式指定类型参数。
我也尝试过从Type t = DR.GetFieldType(i)
指定类型,但我也不能指定await DR.GetFieldValueAsync<t>(i)
。
我在这里运气不好吗?
我应该在异步方法中恢复到以下阻塞代码吗?
// decimal overflow workaround
field.ObjValue =
field.DataType == "Decimal" ?
DR.GetDouble(i) :
DR.GetValue(i);
为什么没有DR.GetValueAsync(i)
返回像同步对应对象一样的对象,这有理论上的原因吗??
次要注释,脱离主题
如果有人坚持要知道我为什么要为十进制编写不同的代码,这就是问题所在。
我猜你说的是DbDataReader
类。
来自文件:
从数据源读取仅向前的行流。
read或ReadAsync读取该行后,该行的值将全部在内存中,这不需要任何I/O,因此不需要异步。
更新:
事实证明,DbDataReader
类中有一个GetFieldValueAsync
方法,但没有GetValueAsync
方法。