2012-07-19 58 views
-1

我有一个程序处理来自经纪人的价格数据。伪代码如下:如何将多线程与顺序要求混合使用?

Process[] process = new Process[50]; 

void tickEvent(object sender, EventArgs e) 
{ 
    int contractNumber = e.contractNumber; 

    doPriceProcess(process[contractNumber], e); 
} 

现在我想用mutlithreading加快我的程序,如果数据是不同的合同号码,我想火了不同的线程来加快这一进程。但是,如果数据来自同一合同,我希望该程序等待当前过程完成,然后再继续处理下一个数据。我该怎么做?

请问你能提供一些代码吗?

由于事先〜

+2

为什么你作一个假设,增加更多的线程将加快进程? – 2012-07-19 19:35:39

+0

每个'tickEvent'你都会得到一个合同号码。那么你想要比较什么数字的平等? – 2012-07-19 19:35:46

+0

@BryanCrosby - 你认为这是一种假设吗?拆分从处理中处理价格数据并同时处理多个经纪商看起来像是这样一个应用程序的合理目标 - 很容易由多线程系统处理。 – 2012-07-20 08:10:14

回答

1

你有很多高水平的建筑decissions使这里:

多少蜱你期望都来自于该经纪人?

毕竟,你应该在这里有一些调度员。

这里是什么主要是做一些简单的介绍:

  • 封装在包进入蜱,有所有的数据需要

  • 最好 单一命令有一个队列,你可以很容易地(和线程安全)可以存储这些命令

  • 有一个分派器,它需要一个队列中的项目,并分配一些工作人员 做命令(或让命令执行本身)

  • 有一个工人,你可以有多个线程,进程或任何 工作的多个命令无缝

  • 也许要为输入队列做一些调度已,具体取决于 您希望能够在每个时间单位完成多少个请求。

下面是一些更多的信息,可以是有益的:

Command pattern in C#

Reactor pattern (with sample code)

+0

+1这样一个系统的明智的设计。将传入的滴答排队到提交,(或重新提交)到线程池以处理每个滴答的'合同对象'的专用队列,听起来不错。 – 2012-07-20 08:13:25

+0

谢谢。希望OP会以类似的方式来判断它。 – 2012-07-20 08:59:11

+0

我想每个合约都有1个线程的线程池,它会强制程序在每个合同上按顺序工作,对吗? – 2012-07-21 10:20:25

0

而不是持有到的Process ES阵列,我将不放的BlockingCollection秒的阵列。每个阻止收集可以对应于特定的合约。然后,您可以让生产者线程将工作添加到相应合同队列的末尾,并且您可以让生产者队列使用这些集合的结果。您可以确保每个线程(我会使用线程而不是进程)处理1-n个不同的队列,但是每个队列都由不超过一个线程处理。这样你就可以确保同一份合同中的任何部分工作并行工作。

这个线程方面可以使用C#的Task类来处理效果。对于您的消费者,您可以为每个BlockingCollection创建一项新任务。这项任务的身体会非常简单,只是为:

foreach(SomeType item in blockingCollections[contractNumber].GetConsumingEnumerable()) 
    processItem(item); 

但是,通过使用Task是你让计算机调度他们,因为它认为合适的。如果它注意到大多数人坐在空荡荡的队列中等候,它只会有几个(或只是一个)实际的线程在它正在使用的任务之间旋转。如果他们试图做得够多,而且你的计算机可以清楚地支持额外线程的负载,那么它会增加更多(可能会随着它的增加而动态添加/删除)。通过让更聪明的人比你或我处理好这个安排,没有低于或超过并行的情况下,更有可能是高效的。

+0

我看着两个答案,我不得不说因为我(缺乏)c#技能,我真的不明白答案。但我认为这可能会奏效,我会为每笔合约创建一个缓冲区,将进入的价格数据存入缓冲区以确保没有数据丢失,然后我会让我的程序尽快处理数据。 – 2012-07-20 09:05:45

+0

是的,这与@Mare Infinitus的答案完全相同,也是我也会这样做的方式。它会正常工作:我多次使用过这种设计/图案。 – 2012-07-20 09:38:03

+0

谢谢,我只是不明白所有的C#行话呢。我认为我在概念上理解它,我需要用我自己的话来说,并且感谢马丁确认它 – 2012-07-21 10:17:53