System.Threading.Tasks.Parallel.For(0, sum, (i) =>
            {
//需要并行运算的方法
)};算法修改的是一个 ref List<int>,通过按钮的按下事件实现结果,点击10次结果正确,10次以后结果就开始变化了,100次以后面目全非....感觉是某一条记录一直在覆盖其他的数据,最后整个表的记录都变成一模一样了。去掉并行,是正确的。哪位大神能解释一下,这是怎么回事?

解决方案 »

  1.   

    对list进行修改操作时,需要对其上锁
      

  2.   

    Parallel.For不是这么用的。就算你做了同步,性能也不会高。Parallel.For是让你“分块”用的,比如你算1万的数据,你分10块足够了(如果你只有4个处理器的话),而不是分1万个任务。具体你要做什么,可以写出来,帮你看看。
      

  3.   

    并行编程是分块进行操作的,不是对一个值进行并行操作的,这样会导致结果出现错误,这涉及多线程出现的问题,应该使用线程同步,更详细内容参考:http://www.cnblogs.com/zhili/archive/2012/07/21/ThreadsSynchronous.html
      

  4.   


    具体的代码不在我的笔记本上,要等明天。大概的需求是这样的:我是做GIS的,基于Arcengine做二次开发。之前写过一个dll,是用输入点找寻最近的道路(线图层)。输入点坐标,返回最近线的ID。单个点计算,大概耗时5毫秒左右。现在面对的是海量数据,800多万个点。所以我就试着用并行计算
      

  5.   


    仅凭回忆,大概是这样的:System.Threading.Tasks.Parallel.For(0, sum, (i) =>            
     { 
    nearestCal.NearestLine(@"C:\test.shp",pointCollection[i].X,pointCollection[i].Y,ref list,i);
    )}; nearestCal.NearestLine是我之前写的dll里的方法改写的
    第一个参数是地图文件的路径
    第二个和第三个参数是点的X与Y坐标,pointCollection 是一个点集合,类似于结构体。pointCollection[i]就是第i个点。
    第四个参数就是一个List<int>
    第五个i 的作用是,运算完最近线的ID,把ID写到list的第i行上.我现在都不比较迷茫该怎么实现800W个点的海量计算,该在什么位置lock