【发布时间】:2014-09-08 13:44:27
【问题描述】:
我有一个获取仪表板视图的 Web API 方法。
该方法调用了大约 24 个不同的查询。每个查询执行大约需要 60 毫秒,我使用 Glimpse 进行分析。
我希望做的是异步运行它们,以避免一个接一个地调用它们,从而使其成为 60 毫秒 X 5 次方法调用。
我也是 Async Await 的新手,所以我的预期可能不正确。
这是我的 Web API 方法
[HttpGet]
[ExceptionHandling]
public async Task<DashboardResponse> GetDashboard()
{
return await DashboardResponse.GetDashboard();
}
这里是辅助方法
public static async Task<DashboardResponse> GetDashboard()
{
var resp = new DashboardResponse();
resp.MonthGlance = await GetMonthAtAGlance();
resp.MostRecentOrder = await GetMostRecentOrder();
resp.CreateAnOrder = await GetCreateAnOrder();
resp.RecentOrders = await GetRecentOrders();
resp.RecentNotifications = await GetRecentNotifications();
var messages = MessageResponse.GetMessages(new MessageFilters() { PageNumber = 1, PageSize = 10 }).Messages;
resp.RecentMessages.Messages = messages;
resp.OrderLineChart = GetOrderLineChart();
return resp;
}
这是辅助方法内部调用的方法之一(其余设置非常相似)
public static async Task<MonthGlanceResp> GetMonthAtAGlance()
{
var monthAtAGlance = new MonthGlanceResp();
var monthStart = new DateTime(DateTime.Now.Year, DateTime.Now.Month, 1);
var monthEnd = monthStart.AddMonths(1).AddDays(-1);
var monthGlanceQuery = Helpers.DbContext.Current.Orders
.Where(c => c.Status != OrderStatuses.Deleted &&
(c.OrderSubSource == OrderSubSources.ApplicantLink ||
c.OrderSubSource == OrderSubSources.BulkImport ||
c.OrderSubSource == OrderSubSources.OrderComprehensive) &&
c.DateIn >= monthStart &&
c.DateIn <= monthEnd).AsQueryable();
if (UserContext.Current.AccountAccess == CustomerAccessTypes.Global)
{
monthGlanceQuery = monthGlanceQuery.Where(c => c.CustomerId == UserContext.Current.CustomerId);
}
else if (UserContext.Current.AccountAccess == CustomerAccessTypes.Account)
{
monthGlanceQuery = monthGlanceQuery.Where(c => c.CustomerAccountId == UserContext.Current.CustomerAccountId);
}
else
{
monthGlanceQuery = monthGlanceQuery.Where(c => c.CustomerAccountPersonId == UserContext.Current.CustomerAccountPersonId);
}
monthAtAGlance.ClearOrderCount = await monthGlanceQuery
.CountAsync(c => c.OrderLineItems
.Where(d => d.ItemType == "package_service" || d.ItemType == "service")
.All(d => d.Result == OrderLineItemResults.Clear && d.Status == OrderLineItemStatuses.ApprovedForClient));
monthAtAGlance.QuestionableOrderCount = await monthGlanceQuery
.CountAsync(c => c.OrderLineItems
.Where(d => d.ItemType == "package_service" || d.ItemType == "service")
.All(d => d.Status == OrderLineItemStatuses.ApprovedForClient) &&
c.OrderLineItems
.Where(d => d.ItemType == "package_service" || d.ItemType == "service")
.Any(d => d.Result == OrderLineItemResults.Questionable));
monthAtAGlance.PendingOrderCount = await monthGlanceQuery
.CountAsync(c => c.OrderLineItems
.Where(d => d.ItemType == "package_service" || d.ItemType == "service")
.Any(d => d.Status != OrderLineItemStatuses.ApprovedForClient));
monthAtAGlance.OrderCount = await monthGlanceQuery.CountAsync();
return monthAtAGlance;
}
唯一的问题是,在实现所有异步等待更改后,现在 Web api 调用的运行速度似乎比以前慢了!我不确定我的结构是否正确,或者即使我的想法是可能的。
【问题讨论】:
-
您正在异步执行任务,但不是并行执行,因此您实际上是在等待每个任务完成后再执行下一个任务。如果您需要异步方法的返回值作为其余方法的返回值,这很有用
-
异步增加了一些开销,但只是一小部分。它的运行速度慢了多少?您是否以毫秒为单位处理?
标签: c# entity-framework asynchronous asp.net-web-api async-await