Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在并行数据处理中使用哪种类型的队列-C#-.NET 4_C#_Multithreading_C# 4.0_Parallel Processing - Fatal编程技术网

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

在并行数据处理中使用哪种类型的队列-C#-.NET 4,c#,multithreading,c#-4.0,parallel-processing,C#,Multithreading,C# 4.0,Parallel Processing,情景: 数据被接收并写入带有时间戳的数据库。我需要按照基于时间戳接收的顺序处理原始数据,并将其写回数据库(不同的表),再次基于时间戳维护顺序 我提出了以下设计:创建了两个队列,一个用于存储数据库中的原始数据,另一个用于在将处理后的数据写回数据库之前存储这些数据。我有两个线程,一个读取初始队列,另一个读取结果队列。在这两者之间,我生成多个线程来处理来自初始队列的数据,并将其写入结果队列 我已经尝试过SortedList(手动锁定)和BlockingCollection。我使用了两种并行处理方法:p

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

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

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

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

我最近发现了OrderingPartitioner,我认为它可以解决这个问题,但在MSDNs示例中,我发现它也没有对底层集合进行排序。我可能需要实现自定义分区器来对复杂数据类型的集合进行排序?或者可能有更好的方法来解决这个问题


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

您考虑过PLINQ和ASORDED()吗?这可能有助于实现您的目标。

就我个人而言,我至少会尝试先使用一个实例作为输入,然后使用一个实例作为结果


我将使用并行Linq来处理结果。为了在处理过程中保持顺序,您可以在PLINQ语句中使用。

也许您已经考虑过这些事情,但是

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


PLINQ很好,但我会尽量避免线程同步要求,如果可以的话,只需将更多的排序数据传递给数据库。

我假设在PLINQ上调用.aspallel()方法,可以为我提供线程安全的项目集合吗?或者我应该自己处理锁定吗?@Dimitri:aspallel()在IEnumerable上调用将正确处理枚举,但在处理数据时仍然需要处理任何需要的内部锁定。非常感谢。在sql语句中选择I do use ordering时,我将对此进行一次尝试,但不能使用大容量插入将输出数据复制回DB,每个点都必须作为单个插入返回,id返回给应用程序进行进一步处理。我很想尽可能地减少SQL的压力,谢谢你的链接,但是我必须把Reed Copsey的回答作为答案