【问题标题】:Multiple AJAX request at the same time slows down ASP.NET WEB API同时多个 AJAX 请求减慢 ASP.NET WEB API
【发布时间】:2015-09-21 05:33:41
【问题描述】:

我有多个 ajax 请求正在进行(其中 5 个)。他们做不同的事情,但最后都是从数据库中获取数据。 如果在某个特定时间只有一个呼叫,则它们不会超过一秒钟。它们都是相似的,无论我叫什么,只要它是唯一运行的请求,在最坏的情况下(通常大约 700 毫秒)不会超过 1-2 秒。 但我同时有仪表板页面和 5 个请求。如果我打开 chrome 调试器,我可以看到:

好的,从浏览器的角度来看,这些请求似乎是异步的,所以我决定使用异步 Web api 方法。它们看起来像这样:

public async Task<List<NightsSoldGraphInfo>> NightsSold(
                      [FromUri]NightsSoldGraphCriteria criteria)
{
   CompressResponse();
   var results = await statisticsRepository.GetNightsSoldGraphData(UserPK, criteria);
   return results;
}

GetNightsSoldGraphData 存储库方法如下所示:

public async Task<List<NightsSoldGraphInfo>> GetNightsSoldGraphData(
                  PrimaryKey userPk, 
                  NightsSoldGraphCriteria criteria)
{
    return await Task.Run(() =>
    {
        using (ADatabase db = new ADatabase(connectionString))
        {
            //SOME DATABASE STUFF
        }
     }
 } 

我将 3 个调用转换为异步版本,我认为我应该注意到性能提升。如何使每个调用大约花费一秒钟(如果这是单独运行每个请求所花费的时间)

这是我在单独运行此方法时得到的结果(当其他所有内容都已加载并且用户只需更改 nights sold 过滤器以获取过滤后的数据时) 500 毫秒。很好。但是,当它们对服务器进行多个 ajax 调用时,如何使其达到 500 毫秒?为什么在第一个示例中需要 5 秒?

是不是因为我使用 session 来获取用户数据,注意 UserPK 是访问 session 的变量?

【问题讨论】:

    标签: c# asp.net-web-api async-await task-parallel-library c#-5.0


    【解决方案1】:

    但是当它们对服务器进行多个 ajax 调用时,如何使其达到 500 毫秒? 为什么在第一个示例中需要 5 秒?

    您所做的是创建一个异步同步包装器。那是anti-pattern。您正在使用线程池线程来执行阻塞工作,而这不能很好地扩展。如果您希望能够正确扩展,有几个因素。

    首先,使用自然的异步 API。例如,实体框架(版本 6 及更高版本)以ToListAsyncFirstOrDefaultAsync 等形式公开异步端点。不要使用Task.Run 旋转新线程,你不需要那个。这实际上是导致您在尝试扩展时看到性能不佳的原因:

    public async Task<List<NightsSoldGraphInfo>> GetNightsSoldGraphData(
                            PrimaryKey userPk, 
                            NightsSoldGraphCriteria criteria)
    {
        using (ADatabase db = new ADatabase(connectionString))
        {
           var entities = await db.SomeTable.Where(x => x.UserKey == userPk)
                                      .ToListAsync();
           return entities;
        }
     }
    

    另一个因素是您同时查询的表。如果其中任何一个正在执行写入操作和一些读取操作,则可能涉及数据库级别的同步。这意味着您必须重新考虑何时查询哪些表,以便能够提供最佳规模。

    【讨论】:

    • 我无法像那样迁移到 EF。好的,我将删除异步内容并哭几分钟:)
    • 您使用的是什么数据库提供程序?
    • 我正在使用 BL 工具包。
    猜你喜欢
    • 2022-10-19
    • 2011-11-28
    • 2017-03-04
    • 1970-01-01
    • 2013-08-26
    • 2018-09-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多