简体   繁体   English

c# 超过 100 个结果在循环中超时

[英]c# more than 100 results timing out on loop

I have a controller that returns a list of records from a database.我有一个 controller 从数据库返回记录列表。 If I request 100 results it returns within 6-8 seconds.如果我请求 100 个结果,它会在 6-8 秒内返回。 If I request 500 results it times out .如果我请求 500 个结果,它会超时

I have debugged the code and found that the EF Core database query is not the issue, it only takes 10-20ms.我调试了代码,发现EF Core数据库查询不是问题,只需要10-20ms。

There are nearly identical controllers/extensions to this and they all return < 1 sec.对此有几乎相同的控制器/扩展,它们都返回 < 1 秒。 Not sure what is happening here.不知道这里发生了什么。

Here is the associated code:以下是相关代码:

Controller Endpoint Controller 端点

[HttpGet("Summary")]
[AutoQuery]
[ProducesResponseType(200, Type = typeof(CollectionDTO<MemberCardQueueEntrySummary>))]
public async Task<IActionResult> GetSummary()
{
    // NOTE: takes 10-20ms
    var entries = await memberService.MemberCardQueueEntries().Include(x => x.Account).ThenInclude(x => x.Division).ApplyAutoQuery(HttpContext.Request.Query.ParseQueryString(), out int total).ToListAsync();

    // NOTE: takes 6-8 seconds for smaller result sets and times outs for larger
    var summaries = entries.ToMemberCardQueueEntrySummaryAsync(mapper);
    var results = summaries.ToList();
    return Ok(new CollectionDTO<MemberCardQueueEntrySummary>
    {
        Count = results.Count,
        Total = total,
        Data = results
    });
}

Extension method that converts one model to the next将一个 model 转换为下一个的扩展方法

public static class MemberCardQueueEntryExtensions
{
    public static IEnumerable<MemberCardQueueEntrySummary> ToMemberCardQueueEntrySummaryAsync(this IEnumerable<MemberCardQueueEntry> entries, IMapper mapper)
    {
        var result = new List<MemberCardQueueEntrySummary>();
        foreach (var x in entries)
        {
            result.Add(x.ToMemberCardQueueEntrySummaryAsync(mapper));
        }
        return result;
    }

    public static MemberCardQueueEntrySummary ToMemberCardQueueEntrySummaryAsync(this MemberCardQueueEntry entry, IMapper mapper)
    {
        var result = mapper.Map<MemberCardQueueEntrySummary>(entry);
        result.AccountName = entry?.Account?.Name;
        result.DivisionName = entry?.Account?.Division?.Name;
        return result;
    }
}

Auto mapper config自动映射器配置

cfg.CreateMap<MemberCardQueueEntry, MemberCardQueueEntry>()
    .IgnoreAllVirtual();
cfg.CreateMap<MemberCardQueueEntry, MemberCardQueueEntryDTO>()
    .IgnoreAllVirtual()
    .ReverseMap();
cfg.CreateMap<MemberCardQueueEntry, MemberCardQueueEntrySummary>()
    .IgnoreAllVirtual();

Have you tried using manual mapper instead of using auto mapper?您是否尝试过使用手动映射器而不是使用自动映射器? so you don't have to carry every parameter in the automapper.所以你不必携带自动映射器中的每个参数。

At least you can see if there is a problem with the mapper or your objects.至少您可以查看映射器或您的对象是否有问题。

Example :
public MemberCardQueueEntrySummary MapTo(MemberCardQueueEntry entry){
    AccountName = entry?.Account?.Name;
    DivisionName = entry?.Account?.Division?.Name;
    ......

}

Find out time of request without autoMapper.找出没有 autoMapper 的请求时间。 Auto mapper works longer where value get null.在值获得 null 的情况下,自动映射器的工作时间更长。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM