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

时间:2011-04-14 17:50:48

标签: c# multithreading c#-4.0 parallel-processing

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

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

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

基于几个因素,每个数据单元可能需要不同的时间来处理。一个线程仍然可以处理第一个数据点,而其他线程每个处理三个或四个数据点,搞乱了时间戳顺序。

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

非常感谢任何有关讨论类似问题的文章的建议和/或链接。

3 个答案:

答案 0 :(得分:5)

就个人而言,我至少会尝试使用BlockingCollection<T>作为输入,并使用ConcurrentQueue<T>实例作为结果。

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

答案 1 :(得分:2)

您是否考虑过PLINQ和AsOrdered()?它可能对您要实现的目标有所帮助。 http://msdn.microsoft.com/en-us/library/dd460719.aspx

答案 2 :(得分:0)

也许你已经考虑过这些事了,但是......

为什么不将时间戳传递给数据库,然后让数据库执行排序或在所有处理线程返回后修复数据库中的顺序? sql语句是否是按顺序执行的?

PLINQ很棒,但我会尝试避免线程同步要求,如果可以,只需将更多订购数据传递给数据库。