在循环中执行时,内存操作中的C#等待实体框架核心非常慢

问题描述 投票:-1回答:1

我有这种代码,我试图用内存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次运行保存变更,这看起来并不多。每个都涉及插入30条记录,总共96,000条记录。

是的,它在内存中,是的,它是在异步方法中的一个循环中,在我们甚至可以执行写操作之前调用并等待2个异步方法,但是现在仍需要20多分钟来运行此测试。

是因为它是内存数据库吗?

c# entity-framework-core in-memory-database
1个回答
0
投票

最后我仍然不知道等待ef核心保存方法的速度比同步版本要慢。但我能够确定问题是内存数据库。我不再使用它,因为我的测试涉及大型结果集 - 我使用真正的测试数据库..

© www.soinside.com 2019 - 2024. All rights reserved.