2012-11-14 170 views
1

上在一分钟C#项目工作 - 的什么,我试图做的是一个总体思路...C# - 多个生产者线程与单个消费者线程

用户有符号的一个或多个组合,他们感兴趣, 每个组合将符号数据下载到csv,解析它,然后运行一组关于数据的规则, 根据这些规则的结果生成警报 组合应该下载数据等,每当设置的时间间隔已经过去了

我打算让每个投资组合都运行在它自己的线程上,那样当间隔已经过去时,每个portfo lio可以继续下载数据,同时解析和运行规则,而不是一个接一个。警报应该被推送到另一个包含警报队列的线程(!)。当它收到警报时,会将它们发送给客户端。

有点多,但是用C#去解决这个问题的最好方法是什么? - 使用线程,或者像后台工作者一样,只需在单独的线程上运行警报队列?

任何意见是非常赞赏,新的一些这方面的东西,以便随时告诉我,如果我完全错了:)

回答

4

您可以使用blocking collection。这是c#4.0中的新功能,用于支持生产者消费者场景。

它还支持1个消费者和多个生产者。

+0

是的,我正在看,或ConcurrentQueue持有警报消息 - 我猜这将运行在一个新的线程,每个组合将运行在它自己的线程以及只包含一个指向队列的指针? – KingTravisG

+0

可能有更多的OO-ish使用一个将alert作为参数的抽象方法来创建'SendAlerts'类。然后,您可以对其进行子类化,以将BlockingCollection和线程实现为私有成员。这很好地封装了客户端的警报,并允许您在稍后必要时轻松更改它。 –

0

如果这完全是间隔驱动,你可以在每个时间间隔结束上传警报到客户端,那么你可以使用一个简单的方法:

当你的时间间隔定时器触发:

  1. 使用TPL启动同时执行的任务来解析数据,为每个任务提供一种回调方法,将警报传回主系统。
  2. 该回调将警报写入受锁定语句保护的List。
  3. 等待所有任务完成。然后执行延续例程将警报转发给客户端。
  4. 重新启动间隔计时器。

如果你需要上传完成之前开始处理下一个区间,你可以使用你写一个清单双缓冲的办法,把那个给上传方法,然后开始写警报到新列表,在收集和上传警报时在列表之间来回切换。