Entity Framework 6.1.3. Асинхронный вызов базы данных ASP.Net значительно медленнее, чем синхронный - PullRequest
0 голосов
/ 28 августа 2018

Я тестирую вызовы базы данных с помощью Include и заметил, что мой код async работает очень медленно по сравнению с синхронным кодом. Учитывая, что синхронный код работает почти в пять раз быстрее, я предполагаю, что сделал что-то ужасно неправильное, но не могу это определить. При взгляде на код, кажется, я жду ToListAsync(), который должен быть правильным. Что я делаю не так или это нормальное поведение?

Примечание: уменьшенные примеры, чтобы сосредоточиться только на одном вызове базы данных, async в примере не нужны, но разница во времени все равно присутствует.

Асинхронный:

[HttpGet]
[Route("{bsid}/{caseId}/async")]
public async Task<IHttpActionResult> GetAsync(string bsid, int caseId)
{
    var db = new DbContext();

    var deviations = await db.RenewalCycles.Where(x => x.Deviations.Any())
        .Include(cycle => cycle.TPCase.CaseNames.Select(caseName => caseName.TPName))
        .Include(cycle => cycle.TPCase.CaseNames.Select(caseName => caseName.TPNameType))
        .Include(cycle => cycle.TPCase.GoodsAndServicesDescriptions)
        .Include(cycle => cycle.TPCase.RelatedCases.Select(relatedCase => relatedCase.TPCaseRelation))
        .Include(cycle => cycle.TPCase.RelatedCases.Select(relatedCase => relatedCase.TPCountry))
        .ToListAsync();

    return Ok();
}

enter image description here

Синхронный:

[HttpGet]
[Route("{bsid}/{caseId}")]
public IHttpActionResult Get(string bsid, int caseId)
{
    var db = new DbContext();

   var deviations = db.RenewalCycles.Where(x => x.Deviations.Any())
        .Include(cycle => cycle.TPCase.CaseNames.Select(caseName => caseName.TPName))
        .Include(cycle => cycle.TPCase.CaseNames.Select(caseName => caseName.TPNameType))
        .Include(cycle => cycle.TPCase.GoodsAndServicesDescriptions)
        .Include(cycle => cycle.TPCase.RelatedCases.Select(relatedCase => relatedCase.TPCaseRelation))
        .Include(cycle => cycle.TPCase.RelatedCases.Select(relatedCase => relatedCase.TPCountry))
        .ToList();

    return Ok();
}

enter image description here

...