【发布时间】:2011-06-20 22:00:51
【问题描述】:
我无法弄清楚为什么我的以下代码无法正常工作。这是它的简化版
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 中的所有项目都不会为空,因为我为每次调用返回结果对象的新实例,但事实并非如此!!!有时 mySafeCollection 缺少一项或一项其元素为空,这意味着 GetResult 已返回空。这根本不符合逻辑!每次调用 GetResult 方法都会创建结果。我最初认为这将是因为 mySafeCollection 集合,它曾经是一个列表,问题是由于 List.Add 方法上的 conrreuncy 问题,但即使切换到 ConcurrentBag 也没有解决问题。有什么线索吗?
【问题讨论】:
-
你为什么不用
.AsParallel().Select? -
与您发布的代码类似的代码应该可以工作。您能否发布一个可以编译但无法正常工作的小示例?
-
.AsParallel().Select 将如何提供帮助?不是一样的吗?不幸的是,要共享的代码要大得多
标签: .net c#-4.0 concurrency parallel-processing