C# awaited entity framework 在循环内执行内存操作的核心非常慢

C# awaited entity framework core in memory operation is very slow when performed within loop

我有这种代码,我正在尝试使用内存中的 ef 核心数据库进行单元测试。

public async Task<int> UpdateHistoricalWeatherDataAllLocationsAsync()
    {
        var regions = DalContext.Region.ToList();

        var allInsertAmounts = new List<int>();

        foreach (var region in regions)
        {
            var startDate = DateTime.Now.AddYears(-3);
            var endDate = DateTime.Now;

            while (startDate < endDate)
            {
                // Hit Api
                HttpResponseMessage res= await HitApi(region, batchStartDate, batchEndDate);
                var parsedResult = await ParseResultToStrongType(apixuResponse);

                var recoredsInserted = await WriteToDb(parsedResult, region, batchStartDate, batchEndDate);

                allInsertAmounts.Add(recoredsInserted);

                startDate = startDate.AddDays(30);
            }
        }

        return allInsertAmounts.Count();
    }

所以我循环一些区域并 foreach 循环一些日期范围。

我点击了一个 api,解析结果,将其发送到保存它的函数。执行此代码的速度非常慢。

下面是使用方法

private async Task<HttpResponseMessage>HitApi(Region region, DateTime startDate, DateTime endDate) {
    return await Client
                .GetAsync(somestring);
}

private async Task<ApiResponse> ParseResultToStrongType(HttpResponseMessage httpResponse) {
    var responseBody = await httpResponse.Content.ReadAsStringAsync();
    return JsonConvert.DeserializeObject<ApiResponse>(responseBody);
}

private async Task<int> WriteToDb(ApiResponse apiData, Region region, DateTime batchStartDate, DateTime batchEndDate) {
    var batch = new List<Thing>();
    foreach (var data in apiData.list) {
        var thing= new Thing {
             // pull the properties out
        };

        batch.Add(newHistoricalWeather);
    }
    DalContext.Thing.AddRange(batch);
    DalContext.SaveChanges();
}

由于某种原因,等待 SaveChangesAsync 的速度非常慢,所以我改为非异步,这似乎已经改善了问题。但我不确定为什么开始时速度很慢...

对于 89 个地区,每个地区大约有 3 年的每月批次,每个国家平均有 5 个地区,我是 (89 * 36) = 3204 次 运行ning savechanges,这看起来并不多。每一个都涉及插入 30 条记录,总共 96,000 条记录。

是的,它在内存中,是的,它在异步方法中的循环中,在我们甚至可以进行写入之前调用并等待 2 个异步方法,但是现在仍然需要 20 多分钟才能 运行 本次测试

是不是因为是内存数据库?

到底是什么等待ef核心保存方法比同步版本慢我还是不知道。但我能够确定问题出在内存数据库中。我不再使用它,因为我的测试涉及大量结果集 - 我使用真实的测试数据库..