在并行数据处理中使用哪种队列-C#-.NET 4

问题描述

|| 场景: 接收数据并将其写入带有时间戳的数据库。我需要按照基于时间戳的顺序处理原始数据,并将其写回到数据库(不同的表)中,再次根据时间戳维护顺序。 我提出了以下设计方案:创建了两个队列,一个队列用于存储数据库中的原始数据,另一个队列用于在将数据写回DB之前存储处理后的数据。我有两个线程,一个读取初始队列,另一个读取结果队列。在这之间,我产生了多个线程来处理来自初始队列的数据并将其写入结果队列。 我已经尝试过SortedList(手动锁定)和BlockingCollection。我使用了两种并行处理方法:Parallel.For(ForEach)和TaskFactory.Task.StartNew。 基于几个因素,每个数据单元可能需要可变的时间来处理。一个线程仍可以处理第一个数据点,而其他线程分别处理三个或四个数据点,从而弄乱了时间戳顺序。 我最近发现了有关OrderingPartitioner的信息,我认为它可以解决问题,但是按照MSDN的示例,我可以看到,它也不对基础集合进行排序。可能需要实现自定义分区程序来订购我的复杂数据类型的集合吗?还是有解决这个问题的更好方法? 高度赞赏讨论任何类似问题的文章的任何建议和/或链接。     

解决方法

就我个人而言,我至少会尝试从输入ѭ0和结果到and1开始。 我将使用Parallel Linq来处理结果。为了在处理过程中保留订单,可以在PLINQ语句上使用AsOrdered()。     ,您是否考虑过PLINQ和AsOrdered()?这可能对您要实现的目标很有帮助。 http://msdn.microsoft.com/en-us/library/dd460719.aspx     ,也许您已经考虑过这些事情,但是... 为什么不将时间戳传递给数据库,然后在所有处理线程返回之后让数据库执行排序或在数据库中修复排序呢? sql语句必须按顺序执行吗? PLINQ很棒,但是我会尽量避免线程同步的要求,并尽可能地将更多排序数据传递给数据库。