先查询出主表总数据量,用多线程去循环主表,结果总数据量却不一样,不知道是为什么。returnList的数据比list要少
for (var i = 0; i < tasks.Length; i++) { var tempCount = Math.Floor(list.Count * 1.0 / tasks.Length); var tempList = list.GetRange((int)(i * tempCount), i < tasks.Length - 1 ? (int)(tempCount) : (listCount - (int)(i * tempCount))); //tasks[i] = System.Threading.Tasks.Task.Factory.StartNew(() => //tempList.ForEach(o => //{ // dynamic obj = new ExpandoObject(); // obj.CName = o.CName; // obj.EName = o.EName; // obj.StudentId = o.StudentId; // returnList.Add(obj); //})); tasks[i] = System.Threading.Tasks.Task.Factory.StartNew(() => { Thread.Sleep(1000); tempList.ForEach(o => { dynamic obj = new ExpandoObject(); obj.CName = o.CName; obj.EName = o.EName; obj.StudentId = o.StudentId; returnList.Add(obj); }); }); } if (System.Threading.Tasks.Task.WaitAll(tasks, -1)) { var count = 1; foreach (var task in tasks) { if (task.IsCompleted) { count++; } } }
我想你的 returnList 不支持原子操作。
lock(returnList){
returnList.Add(obj)
}
如果要超过array容量时,会自动扩容。正常来说是没有问题,但是如果在多线程中,会同时触发扩容,但最终只有一个能成功,失败的都被GC了。
你的数据在扩容时被添加到要被丢弃的数组里去了。
谢谢帮助!