C# 异步-已经有一个与此命令关联的打开的DataReader,必须先关闭它

C# 异步-已经有一个与此命令关联的打开的DataReader,必须先关闭它,c#,.net,async-await,C#,.net,Async Await,我将代码中的一个方法从sync更改为async,但现在我在应用程序中使用该功能时看到了上述异常。我想知道我如何实现异步方法是否有问题 方法如下: private async Task<IEnumerable<CarModel>> GetCarModelsAsync(Car car, carOptions carOptions) { return (await Task.WhenAll(car.Models.Where(x => carOptions.Sele

我将代码中的一个方法从sync更改为async,但现在我在应用程序中使用该功能时看到了上述异常。我想知道我如何实现异步方法是否有问题

方法如下:

private async Task<IEnumerable<CarModel>> GetCarModelsAsync(Car car, carOptions carOptions)
{
    return (await Task.WhenAll(car.Models.Where(x => carOptions.SelectedModelIds.Contains(x.Id))
        .Select(async car => new CarModel
        {
            MyDocumentModel = await_myModelBuilder.GetDocumentModel(car),
            MyDocumentModelB = await _myBuilderB.GetDocumentModel(car),
            MyDocumentModelC = await _myBuilderC.GetDocumentModel(car),
            MyDocumentModelD = await _myBuilderD.GetDocumentModel(car),
            MyDocumentModelE = _myBuilderE.GetDocumentModel(car)

        MyDocumentModelF = _myBuilderE.GetDocumentModel(car)
        }))).ToList();
}
public async Task<VehicleModel> GetVehcileModel(Car car, CarOptions carOptions)
{
    Task<IEnumerable<CarModel>> cars = GetCarModelsAsync(car, carOptions);

    return new VehicleModel
    {
        CarModels = await cars
    };
}
我这样做了,它解决了这个问题,但我想知道的是,这只是把一个黑客修复,而不是解决一个代码问题

还是我如何开发这个异步方法的问题

GetCarModelAsync的调用方法如下:

private async Task<IEnumerable<CarModel>> GetCarModelsAsync(Car car, carOptions carOptions)
{
    return (await Task.WhenAll(car.Models.Where(x => carOptions.SelectedModelIds.Contains(x.Id))
        .Select(async car => new CarModel
        {
            MyDocumentModel = await_myModelBuilder.GetDocumentModel(car),
            MyDocumentModelB = await _myBuilderB.GetDocumentModel(car),
            MyDocumentModelC = await _myBuilderC.GetDocumentModel(car),
            MyDocumentModelD = await _myBuilderD.GetDocumentModel(car),
            MyDocumentModelE = _myBuilderE.GetDocumentModel(car)

        MyDocumentModelF = _myBuilderE.GetDocumentModel(car)
        }))).ToList();
}
public async Task<VehicleModel> GetVehcileModel(Car car, CarOptions carOptions)
{
    Task<IEnumerable<CarModel>> cars = GetCarModelsAsync(car, carOptions);

    return new VehicleModel
    {
        CarModels = await cars
    };
}
public异步任务GetVehcileModel(Car-Car,CarOptions-CarOptions)
{
任务车=GetCarModelAsync(车,车选项);
返回新车辆模型
{
CarModels=等待汽车
};
}

这个异步代码的编写方式有问题吗?或者这个问题更可能出现在正在等待的一个_myBuilder调用中——我试图检查它们并确保.ToList()被放在需要的地方,但可能我仍然缺少其中的一个或两个_myBuilders

Does
GetCarModelsAsync
缓冲区在哪里?i、 e.是否将数据消耗到列表中,从管道中读取所有数据?或者它是否提供了一个仍然从开放连接获取数据的开放枚举?这件事很重要。显然,我们还没有异步可枚举,但是:
GetCarModelsAsync
仍然只能是部分异步的,即在第一行之前是异步的,或者类似的(然后通过非异步读取API进行同步)@MarcGravel-不是100%确定您的意思-GetCarModelAsync然后GetVechileModel实际返回的数据用于通过流生成word文档-如果可以提供更清晰的信息,我可以添加此代码,如果可以进一步帮助的话,我可以添加来自_myBuilders的部分代码-如我所说,将标志添加到DB连接字符串中解决了这个问题-但这似乎不是正确的解决方法。猜猜如果它能工作,我可以留下它,但添加此标志会导致其他未知问题,可能会破坏其他领域的代码,甚至导致性能问题。我想说的是:一旦您等待了
任务
,这并不意味着您已经消耗了所有数据-因为
IEnumerable
仍然可以是一个开放的枚举器。如果它与DB对话,那么它仍然可以表示一个开放的数据reader@Ctrl_Alt_Defeat
.ToList()
只是出于好奇,你想做什么?你忽略了多少编译器警告?
GetCarModelsAsync
buffer?i、 e.是否将数据消耗到列表中,从管道中读取所有数据?或者它是否提供了一个仍然从开放连接获取数据的开放枚举?这件事很重要。显然,我们还没有异步可枚举,但是:
GetCarModelsAsync
仍然只能是部分异步的,即在第一行之前是异步的,或者类似的(然后通过非异步读取API进行同步)@MarcGravel-不是100%确定您的意思-GetCarModelAsync然后GetVechileModel实际返回的数据用于通过流生成word文档-如果可以提供更清晰的信息,我可以添加此代码,如果可以进一步帮助的话,我可以添加来自_myBuilders的部分代码-如我所说,将标志添加到DB连接字符串中解决了这个问题-但这似乎不是正确的解决方法。猜猜如果它能工作,我可以留下它,但添加此标志会导致其他未知问题,可能会破坏其他领域的代码,甚至导致性能问题。我想说的是:一旦您等待了
任务
,这并不意味着您已经消耗了所有数据-因为
IEnumerable
仍然可以是一个开放的枚举器。如果它与DB对话,那么它仍然可以表示一个开放的数据reader@Ctrl_Alt_Defeat
.ToList()
只是出于好奇,你想做什么?你忽略了多少编译器警告?