我正在研究一个处理Intranet Web应用程序速度的问题,以及一个获取数据库中所有项目后代的函数。
我无权访问家中的代码,但我可以描述问题和流程:
我们有一个数据库表,用于存储可以链接到同一个表中的父项的项。我们有阻止循环引用的逻辑,因此理论上后代链接不应该回退(到目前为止还没有发生过这样的事情)。
当用户访问Web应用程序上的页面时,目前我有一些函数可以获取该项目的后代列表并将其放入对象中。这最初是在一个正常的FOR循环中完成的,但是解析881个实体所需的时间需要12秒以上,这需要改变。我查看了线程并实现了Parallel FOR循环,它花了12秒到1-2秒的时间,除了我在页面上随机出错。
部分错误包括未填充下拉列表,连接状态未打开且可用,连接已关闭且无法使用。
原始代码如下:
var DS = _uow.locations.AllEager().FirstOrDefault( l => l.Zone == "DS");
var hwddl = new List<HWTXSelectItem>();
var HWinDS = _uow.hw.AllEager().Where(h => h.Locations_ID == DSS.Locations_ID).OrderBy(h => h.ID).ToArray();
var dataSet =_uow.hw.AllEager().Where(h => h.IsActive && h.Parent_ID != null).Select(h => new HierarchyObject() {id=h.HW_ID, parentId = Parent_ID}).ToList();
var assets = _uow.hw.AllEager();
var arrayCount = HWinDS.Length;
for(int i = 0; i < arrayCount; i++){
var hw in HWinDS[i];
var HWDescendants = Helpers.FindAllChildren(dataSet, new HierarchyObject() {id=hw.HWID, parendId=null}).ToList();
var descendends = new List<int>();
descendends.AddRange(HWDescendants.Select(m => m.id);
var allChildren = assets.Where(h => descendends.Contains(h.HW_ID) && IsActive).ToList();
var direct = allChildren.Where(h => h.ParentID == hw.HW_ID).Select(h => new{hwid = h.HWID, id=h.HW_ID}).OrderBy(h => h.hwid).ToList();
var sub = allChildren.Where(h => h.Parent_ID != hw.HW_ID).Select(h => new{hwid = h.HWID, id=h.HW_ID}).OrderBy(h => h.hwid).ToList();
hwtxddl.Add(new HWTXSelectItem
{
...
... <obj properties>
...
});
}
HWFromDS = hwddl;
并行化就像:
var DS = _uow.locations.AllEager().FirstOrDefault( l => l.Zone == "DS");
var hwddl = new List<HWSelectItem>();
var HWinDS = _uow.hw.AllEager().Where(h => h.Locations_ID == DS.Locations_ID).OrderBy(h => h.ID).ToArray();
var dataSet =_uow.hw.AllEager().Where(h => h.IsActive && h.Parent_ID != null).Select(h => new HierarchyObject() {id=h.HW_ID, parentId = Parent_ID}).ToList();
var items = _uow.hw.AllEager();
var arrayCount = HWinDS.Length;
Parallel.For(0, arrayCount,i =>
{
var hw in HWinDS[i];
var HWDescendants = Helpers.FindAllChildren(dataSet, new HierarchyObject() {id=hw.HW_ID, parendId=null}).ToList();
var descendends = new List<int>();
descendends.AddRange(HWDescendants.Select(m => m.id);
var allChildren = assets.Where(h => descendends.Contains(h.HWAssets_ID) && IsActive).ToList();
var direct = allChildren.Where(h => h.Parent_ID == hw.HW_ID).Select(h => new{hwid = h.HWID, id=h.HW_ID}).OrderBy(h => h.hwid).ToList();
var sub = allChildren.Where(h => h.Parent_ID != hw.HW_ID).Select(h => new{hwid = h.HWID, id=h.HW_ID}).OrderBy(h => h.hwid).ToList();
hwddl.Add(new HWSelectItem
{
...
... <obj properties>
...
});
}
HWFromDS = hwddl;
我有一些并行for循环的工作和加速过程,整体时间为6秒,部分数据返回,没有错误,1秒,所有数据返回随机错误。上面的一个似乎与完整数据返回一起工作,但在随机点给出随机错误。有什么提示吗?