C# 如何将多线程与顺序需求相结合?
我有一个程序来处理来自经纪人的价格数据。伪代码如下所示:C# 如何将多线程与顺序需求相结合?,c#,multithreading,C#,Multithreading,我有一个程序来处理来自经纪人的价格数据。伪代码如下所示: Process[] process = new Process[50]; void tickEvent(object sender, EventArgs e) { int contractNumber = e.contractNumber; doPriceProcess(process[contractNumber], e); } 现在我想使用多线程来加速我的程序,如果数据的合同号不同,我想启动不同的线程来加
Process[] process = new Process[50];
void tickEvent(object sender, EventArgs e)
{
int contractNumber = e.contractNumber;
doPriceProcess(process[contractNumber], e);
}
现在我想使用多线程来加速我的程序,如果数据的合同号不同,我想启动不同的线程来加速进程。但是,如果数据来自同一个合同,我希望程序等到当前进程完成后再继续处理下一个数据。我该怎么做
你能提供一些代码吗
提前感谢~与其保留一组
进程
es,不如保留一组BlockingCollection
s。每个阻塞集合可以对应于一个特定的契约。然后,您可以让生产者线程将要做的工作添加到相应契约队列的末尾,也可以让生产者队列使用这些集合的结果。您可以确保每个线程(我将使用线程,而不是进程)处理1-n个不同的队列,但每个队列只由一个线程处理。这样,您就可以确保同一合同中的任何工作都不会并行进行
使用C#的任务
类可以有效地处理线程方面的问题。对于您的消费者,您可以为每个BlockingCollection
创建一个新任务。该任务的主体基本上是:
foreach(SomeType item in blockingCollections[contractNumber].GetConsumingEnumerable())
processItem(item);
但是,通过使用
任务
s,您可以让计算机根据需要安排任务。如果它注意到大多数线程都坐在空队列中等待,那么它只会有几个(或只有一个)实际线程在正在使用的任务之间旋转。如果他们试图做得足够多,并且您的计算机显然能够支持额外线程的负载,那么它将添加更多线程(可能会在运行过程中动态添加/删除)。通过让比你或我聪明得多的人来处理这种调度,在没有并行化不足或过度并行化的情况下,更有可能提高效率 您需要在这里做出许多高层架构决策:
你预计那个经纪人会给你多少钱
毕竟,这里应该有一个调度员
以下是一些基本操作的简单描述:
- 最好将传入的滴答声封装在包中 包含所有所需数据的单个命令
- 有一个队列,您可以轻松(线程安全)存储这些命令
- 有一个调度器,它接收队列中的一个项目并分配一些工人 执行命令(或让命令自行执行)
- 拥有一个worker,您可以拥有多个线程、进程或其他任何内容 无条件地使用多个命令
- 可能您想对输入队列执行一些调度,具体取决于 取决于您希望每个时间单位能够完成的请求数
为什么您会假设添加更多线程会加快进程?每次
ticketvent
您都会得到一个合同号。那么,为了平等,你想比较哪些数字?@Bryancrossby-顺便问一下,你认为这是一个假设吗?将价格数据的检索从其处理中分离出来并同时处理多个经纪人似乎是这样一个应用程序的合理目标——由多线程系统轻松处理。+1是这样一个系统的合理设计。将传入的标记排队到已提交(或重新提交)到线程池的“合同对象”的专用队列中,以便按顺序处理每个标记听起来不错。谢谢。希望OP会以类似的方式来判断。我想每个契约都有一个1线程的线程池,这将迫使程序按顺序处理每个契约,对吗?如果您通过某个id为每个契约分配一个线程,它们将按顺序处理这些契约。确保每个线程都可以存储契约,这样它在工作时就不会阻塞。这也可以通过回答中描述的队列来实现。我看了两个答案,我不得不说,由于我(缺乏)c#技能,我不太理解答案。但我认为这可能会起作用,我会为我拥有的每个合同创建一个缓冲区,将传入的价格数据存储到缓冲区中,以确保没有数据丢失,然后我会让我的程序尽快处理数据。是的,这在本质上与@Mare infiniteus answer相同,我也会这样做。它会很好用的:我已经用过很多次这样的设计/图案。谢谢,我只是还不懂所有的c#行话。我想我从概念上理解了它,我需要用我自己的话来表达,感谢马丁的确认