在并行数据处理中使用什么类型的队列 - C# - .NET 4

Dim*_*tri 6 c# parallel-processing multithreading c#-4.0

场景:接收数据并将其写入带有时间戳的数据库.我需要按照基于时间戳接收的顺序处理原始数据,并将其写回数据库,不同的表,再次根据时间戳维护订单.

我提出了以下设计:创建了两个队列,一个用于存储来自数据库的原始数据,另一个用于存储已处理的数据,然后再写回数据库.我有两个线程,一个读取初始队列,另一个读取Result队列.在我之间生成多个线程来处理来自Initial队列的数据并将其写入Result队列.

我已经尝试过SortedList(手动锁定)和BlockingCollection.我使用了两种并行处理方法:Parallel.For(ForEach)和TaskFactory.Task.StartNew.

基于若干因素,每个数据单元可能花费可变的时间来处理.一个线程仍然可以处理第一个数据点,而其他线程每个处理三个或四个数据点,搞乱了时间戳顺序.

我最近发现了OrderingPartitioner,我认为它可以解决问题,但是按照MSDN的例子我可以看到,它也没有对基础集合进行排序.可能是我需要实现自定义分区器来订购我的复杂数据类型集合?或者可能有更好的方法来解决问题?

任何有关讨论类似问题的文章的建议和/或链接都受到高度赞赏.

Ree*_*sey 5

就个人而言,我至少会尝试开始使用BlockingCollection<T>输入和ConcurrentQueue<T>结果的实例.

我会使用Parallel Linq来处理结果.为了在处理过程中保留顺序,可以在PLINQ语句中使用AsOrdered().