Parallel.ForEach和共享安全集合!

时间:2011-06-20 22:00:51

标签: .net c#-4.0 concurrency parallel-processing

我无法弄清楚为什么我的以下代码无法正常工作。这是它的简化版本

public class TheClass
{
    protected void SomeMethod(List<string> works)
    {
         ConcurrentBag<MyResult> mySafeCollection= new ConcurrentBag<MyResult>();

         Parallel.ForEach(works, work=>
            { 
                   mySafeCollection.Add(GetResult(work));

            }
    }

    private MyResult GetResult(string work)
    {
        ResultClass result = new ResultClass ();
        result.Id = "some text";
        //Some work here to set result.Value
        return result;
     }
}

如图所示,我有一个类,它获取字符串列表,工作,然后调用一些本地方法,它执行一些工作并返回结果对象。我希望mySafeCollection中的项目数量始终与作品相同,并且mySafeCollection中的任何项目都不会为null,因为我为每个调用返回结果对象的新实例,但事实并非如此!有时mySafeCollection缺少一个项或一个元素为null,这意味着GetResult返回null。这根本不符合逻辑!为每次调用GetResult方法创建结果。我最初认为这是因为mySafeCollection集合曾经是一个列表,问题是由于List.Add方法的conrreuncy问题,但即使切换到ConcurrentBag也没有解决问题。任何线索?

1 个答案:

答案 0 :(得分:0)

我认为这是一场竞争条件。 Parallel.ForEach的重载之一是

Action<TLocal> localFinally

如果您使用该操作来捕捉最终结果,除其他外,它应该让您有机会做出回应,以便您仍可以对此采取行动。