C# 多个AJAX请求同时执行会降低ASP.NET WEB API的速度
我有多个ajax请求(其中5个)。它们做不同的事情,但最后都是从数据库中获取数据。 如果在某个特定时间只有一个呼叫,则不会超过1秒。所有这些都是相似的,无论我调用哪一个,只要它是唯一运行的请求,在最坏的情况下(通常大约700ms),它不会超过1-2秒。 但我有仪表板页面和5个请求在同一时间。如果我打开chrome调试器,我可以看到: 好的,从浏览器的角度来看,这些请求似乎是异步的,所以我决定使用异步web api方法。它们看起来像这样:C# 多个AJAX请求同时执行会降低ASP.NET WEB API的速度,c#,asp.net-web-api,async-await,task-parallel-library,c#-5.0,C#,Asp.net Web Api,Async Await,Task Parallel Library,C# 5.0,我有多个ajax请求(其中5个)。它们做不同的事情,但最后都是从数据库中获取数据。 如果在某个特定时间只有一个呼叫,则不会超过1秒。所有这些都是相似的,无论我调用哪一个,只要它是唯一运行的请求,在最坏的情况下(通常大约700ms),它不会超过1-2秒。 但我有仪表板页面和5个请求在同一时间。如果我打开chrome调试器,我可以看到: 好的,从浏览器的角度来看,这些请求似乎是异步的,所以我决定使用异步web api方法。它们看起来像这样: public async Task<List<
public async Task<List<NightsSoldGraphInfo>> NightsSold(
[FromUri]NightsSoldGraphCriteria criteria)
{
CompressResponse();
var results = await statisticsRepository.GetNightsSoldGraphData(UserPK, criteria);
return results;
}
public async Task<List<NightsSoldGraphInfo>> GetNightsSoldGraphData(
PrimaryKey userPk,
NightsSoldGraphCriteria criteria)
{
return await Task.Run(() =>
{
using (ADatabase db = new ADatabase(connectionString))
{
//SOME DATABASE STUFF
}
}
}
我将3个调用转换为异步版本,我想我应该注意到性能的提升。如何使每个调用花费大约1秒的时间(如果这是单独运行时每个请求所花费的时间)
这就是我在单独运行此方法时得到的结果(当加载了所有其他内容并且用户只是更改了过滤器以获得过滤数据时)
500毫秒。很好。但当它们是对服务器的多个ajax调用时,如何使其达到500毫秒呢?为什么在第一个示例中需要5秒钟
是不是因为我使用会话来获取用户数据,请注意UserPK,它是访问会话的变量
但当它们是对服务器的多个ajax调用时,如何使其达到500毫秒呢?
为什么在第一个示例中需要5秒钟
您所做的是创建一个异步over sync包装器。这是一个错误。您正在使用线程池线程来执行阻塞工作,这不能很好地扩展。如果您希望能够适当地扩展,那么有几个因素可以考虑
首先,使用自然异步API。例如,Entity Framework(版本6及更高版本)以ToListSync
和FirstOrDefaultAsync
等形式公开异步端点。不要使用任务旋转新线程。运行,您不需要它。这实际上是导致您在尝试扩展时看到性能不佳的原因:
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;
}
}
公共异步任务GetNightsSoldGraphData(
PrimaryKey用户PK,
NightsSoldGraphCriteria标准)
{
使用(ADatabase db=newadatabase(connectionString))
{
var entities=await db.SomeTable.Where(x=>x.UserKey==userPk)
.ToListAsync();
返回实体;
}
}
另一个因素是您同时查询哪些表。如果其中任何一个正在执行写操作和一些读操作,那么可能会在数据库级别涉及同步。这意味着您必须重新考虑何时查询哪些表,以便能够提供最佳比例。我不能像那样移动到EF。好的,我会删除异步的东西,然后哭几分钟:)你在用什么DB提供程序?我在用BL工具包。