0

我有一个通用阅读器,我想将它从同步转换为异步。

原始代码是

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)返回像同步对应对象这样的对象?

小记,题外话

如果有人坚持要知道我为什么要为十进制编写不同的代码,这就是问题所在

4

1 回答 1

0

我假设您在谈论DbDataReaderClass

从文档中:

从数据源读取只进的行流。

一旦通过ReadReadAsync读取该行,该行的值将全部在内存中,这不需要任何 I/O,因此不需要是异步的。

更新:

事实证明,Class中有一个GetFieldValueAsync方法,但没有方法。DbDataReaderGetValueAsync

于 2020-09-15T20:29:51.987 回答