我无法弄清楚为什么我的以下代码无法正常工作。这是它的简化版本
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也没有解决问题。任何线索?
答案 0 :(得分:0)
我认为这是一场竞争条件。 Parallel.ForEach的重载之一是
Action<TLocal> localFinally
如果您使用该操作来捕捉最终结果,除其他外,它应该让您有机会做出回应,以便您仍可以对此采取行动。