【发布时间】:2013-06-03 21:54:16
【问题描述】:
我正在尝试使用多线程来更快地处理结果列表。我尝试为每个使用并行,但是当运行过程方法时,我没有收到正确的结果。
private IEnumerable<BulkProcessorResult> GetProccessResults(List<Foo> Foos)
{
var listOfFooLists = CreateListOfFooLists(Foos);
var bulkProcessorResults = new List<BulkProcessorResult>();
Parallel.ForEach(listOfFooLists, FooList =>
{
foreach (var Foo in FooList)
{
var processClaimResult = _processor.Process(Foo);
var bulkProcessorResult = new BulkProcessorResult()
{
ClaimStatusId = (int) processClaimResult.ClaimStatusEnum,
Property1 = Foo.Property1
};
bulkProcessorResults.Add(bulkProcessorResult);
}
});
return bulkProcessorResults;
}
如果我使用普通的 forEach,我会得到正确的输出。如果我使用上面的代码,当应该有三个状态为 1 和一个状态为 3 时,我会得到所有 2 的状态。
我对线程非常陌生,所以任何帮助都会很棒。
【问题讨论】:
-
语言是什么?您应该将其添加到标签中。
-
你可能想看看例如
ConcurrentQueue<T>作为中间存储。从多个线程操作List<T>是不安全的(例如通过调用Add)。任何事情都可能(并且可能会)发生。 -
我看到的第一个问题是您有多个并发线程将项目添加到
buldProcessResults。这会导致问题,因为List.Add并非设计用于处理多个并发更新。你需要用锁来保护它,或者使用某种类型的并发数据结构。 -
@Damien_The_Unbeliever 补充说,当我使用 ConcurrentQueue
时,它可以解决我的所有问题。谢谢。
标签: c# multithreading task-parallel-library