【发布时间】:2016-09-09 14:06:42
【问题描述】:
我正在开发 asp.net 应用程序以在仪表板上显示多个小部件。所以我发送了一个 ajax 调用来获取仪表板小部件所需的所有数据。
在服务器方法内部,有多个数据库调用通过存储过程从数据库中获取每个小部件的相关数据。方法内容如下;
List<DashboardItem> items = new List<DashboardItem>();
items.Add(GetUserList());
items.Add(GetNewsList());
items.Add(GetRecentlyViewedList());
items.Add(GetSentEmailsList());
.....
return items;
由于数据库中没有记录,这个过程似乎很慢。
我正在尝试使用异步数据库调用执行上述代码。似乎异步数据库操作可以改善这个过程。谁能帮我写异步数据库操作?或任何其他提高数据库方法调用性能的建议?
【问题讨论】:
-
在您的 GetXXX 上使用带有
await关键字的异步版本的数据库连接器,然后返回DashboardItem[]而不是返回Task<DashboardItem[]>,然后您可以创建一个List<Task<DashboardItem[]>>,添加返回的来自这些函数的任务,然后执行await Task.WaitAll(theListOfTasks),最后使用列表中存储的每个任务的.Result。 -
不要尝试并行执行查询,只需将它们全部批处理。 NHibernate 允许批处理,EF 可以使用扩展批处理查询。只有当您必须在多个网卡上移动 很多(想想 GB)的数据数据时,并行执行才有帮助。否则,您只需引入更多的并发开销并使用比需要更多的连接
-
@Gusman 使用像
WaitAll这样的阻塞方法是一个坏的想法。重点是减少阻塞。await Task.WhenAll()不会阻止。 -
@Aruna 不,这不会导致延迟,除非 SP没有写得很好。顺便说一句,原始 SQL 查询与存储过程之间没有性能差异。 确实 导致延迟的是建立多个连接和不必要的往返。您可以将所有呼叫批量处理,只需支付单次往返费用。
标签: c# asp.net multithreading ado.net async-await