首页 新闻 搜索 专区 学院

使用多线程查询时,查询出来的总数据量对不上

0
悬赏园豆:5 [已解决问题] 解决于 2016-06-15 16:47

先查询出主表总数据量,用多线程去循环主表,结果总数据量却不一样,不知道是为什么。returnList的数据比list要少

var remarks = RemarkService.FindAll(o => studentIds.Contains(o.UserId)).ToList();
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++;
                        }
                    }


                }
hardy_Wang的主页 hardy_Wang | 初学一级 | 园豆:53
提问于:2016-06-15 15:37
< >
分享
最佳答案
0

 

我想你的 returnList 不支持原子操作。

lock(returnList){

returnList.Add(obj)

}

如果要超过array容量时,会自动扩容。正常来说是没有问题,但是如果在多线程中,会同时触发扩容,但最终只有一个能成功,失败的都被GC了。

你的数据在扩容时被添加到要被丢弃的数组里去了。

 

收获园豆:5
长蘑菇星人 | 小虾三级 |园豆:1832 | 2016-06-15 15:43

谢谢帮助!

hardy_Wang | 园豆:53 (初学一级) | 2016-06-15 16:47
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册