平行的Foreach比赛条件

时间:2013-04-05 17:44:02

标签: asp.net-mvc-4 parallel-processing race-condition parallel.foreach

我遇到一个并行foreach在完成执行之前关闭连接的问题。当我有一个常规的foreach循环runnung它很慢但它会返回一切。一旦我改为平行的foreach,它现在返回大约95%的数据并终止。

下面是我正在使用的代码:

var USPostalCodes = repository.GetUSPostalCodes();
                var CAPostalCodes = repository.GetCAPostalCodes();

                Parallel.ForEach(spreadsheetinfo, location =>
                {

                    LocationData Locationdata = new LocationData()
                    {
                        id = location.Id,
                        Market = repository.GetMarketsForPostalCode(location.PostalCode, uploadedFile, USPostalCodes, CAPostalCodes),
                    };

                    locationlist.Add(Locationdata);
                });

I added the following code to check and see what was going on, and that fixed it so that it is returning all rows so i know that a race condition exists but what i can't figure out is why and how ot fix it.  any suggestions would be greatly appreciated

Console.WriteLine("Processing {0} on thread {1}", Locationdata,
                                    Thread.CurrentThread.ManagedThreadId);

1 个答案:

答案 0 :(得分:2)

locationlist可能不是线程安全的。 因此,您正在破坏列表。

相反,您应该使用.AsParrelel.Select()并行运行委托,并返回带有结果的IEnumerable<T>