c#ASP MVC Parallel for循环,获取后代,随机错误

时间:2018-05-15 12:28:43

标签: c# .net multithreading model-view-controller

我正在研究一个处理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秒,所有数据返回随机错误。上面的一个似乎与完整数据返回一起工作,但在随机点给出随机错误。有什么提示吗?

0 个答案:

没有答案