List<ModelItem> ModelItems = model.RootItem.Children.ToList(); private static List<ModelItem> GetModelItem(ModelItem modelItem/, List<ModelItem> modelElements/) { List<ModelItem> modelElements = new List<ModelItem>(); if (modelItem != null) { modelItems.Add(modelItem); modelElements.Add(modelItem); } if(modelItem.Children.Count() > 0) { foreach (ModelItem ChildrenModelItem in modelItem.Children) { //List<ModelItem> models = new List<ModelItem>(); List<ModelItem> modelItems = GetModelItem(ChildrenModelItem/, models/); modelElements.AddRange(modelItems); //modelElements.AddRange(modelItems); } } return modelElements; } 优化这段代码 Task.Factory.StartNew(() => Parallel.ForEach<List<ModelItem>, List<ModelItem>>(ModelItems, () => null, (j, loop ,h) => { h = GetModelItem(j); return h; }), (finalResult) => Interlocked.Add(ref modelItems, finalResult) );减少处理时间,保证遍历递归出来的数据的完整性
时间: 2024-03-11 11:49:12 浏览: 68
这段代码中的递归遍历可以使用并行处理来优化。你可以使用Parallel.ForEach()方法在多个线程上同时执行循环,并使用Interlocked.Add()方法来保证多个线程的结果正确累加。这样可以减少处理时间,同时保证遍历递归出来的数据的完整性。
下面是优化后的代码:
```
List<ModelItem> modelItems = new List<ModelItem>();
Task.Factory.StartNew(() =>
{
Parallel.ForEach(ModelItems, () => new List<ModelItem>(), (j, loop, localList) =>
{
localList.AddRange(GetModelItem(j, new List<ModelItem>()));
return localList;
},
(finalResult) =>
{
lock (modelItems)
{
modelItems.AddRange(finalResult);
}
});
}).Wait();
```
这里使用了Task.Factory.StartNew()方法来启动一个新任务,并在其中使用Parallel.ForEach()方法并行处理所有的ModelItems。在每个线程上都会创建一个localList列表,用于存储GetModelItem()方法返回的结果。最后通过lock关键字来保证多个线程的结果正确累加到modelItems列表中。最后使用Wait()方法等待任务完成。
阅读全文