Parallel.ForEach平行线程中的实体的值在输出或打印时二次赋值是可能会串

来源:互联网 发布:东莞金域名苑 编辑:程序博客网 时间:2024/06/05 20:26

今天用平行线程跑了一给程序,大致的程序业务为:我需要对商品先的商品图片进行遍历和操作,所以我先把商品实体集合装入平行线程的循环中,其次在循环商品的同时,根据商品 ID获取到该商品下的图片实体集合,然后遍历图片实体集合,将商品 ID和图片ID写入日志,结果发现,商品ID不一致。

这可能是微软平行线程中的一个bug, 绕开这种问题则查询出商品图片,同时将商品 ID也装入商品图片集合中,这样输出是商品 ID和商品图片ID才相对于。

平行线程中又嵌套循环,使用时注意了。

以下是实体值串了的主体代码。

//遍历商品

Parallel.ForEach(listJavaProduct, (m, loopState) =>
            {
                    listJavaImage = dal.GetJavaImageList(productID, ref strMessage);//获取到该商品下的图片集合
                    Thread.Sleep(5);//休眠5毫米,注意是停顿下测试效果好些
                  
                    foreach (var pic in listJavaImage)//遍历商品图片
                    {
                    log.Info("商品ID:" + m.ID + "实际的商品ID:" + pic.ID + "商品图片ID:" + pic.ImageID); 

   }
              
            });

以下是实体值串了的部分日志

商品ID:6345 - 实际的商品ID : 2商品图片ID:102717
商品ID:9310 - 实际的商品ID :6 商品图片ID:54114
商品ID:9322 - 实际的商品ID :3 商品图片ID:97914
商品ID:9310 - 实际的商品ID :4 商品图片ID:97916
商品ID:9310 - 实际的商品ID :4 商品图片ID:97918
商品ID:9310 - 实际的商品ID :4 商品图片ID:97920

原创粉丝点击