C# - 具有单个使用者线程的多个生产者线程

时间:2012-11-14 11:53:59

标签: c# multithreading thread-safety blocking producer-consumer

在一分钟内处理一个C#项目 - 关于我正在尝试做的一般概念是......

用户有一个或多个投资组合,其中包含他们感兴趣的符号, 每个组合将符号上的数据下载到csv,解析它,然后对数据运行一组规则, 警报是根据这些规则的结果生成的 投资组合应该在设定的时间间隔过后下载数据等

我计划让每个组合在其自己的线程上运行,这样当间隔时间过去时,每个组合可以继续下载数据,同时解析和运行规则,而不是一个接一个。然后应将警报推送到包含警报队列的另一个线程(!)。当它收到警报时,会将它们发送给客户端。

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

任何建议都非常感谢,对这些东西不熟悉所以请随时告诉我,如果我完全错了:)

2 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:0)

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

当您的间隔计时器触发时:

  1. 使用TPL启动同步任务来解析数据,为每个任务提供一个回调方法,将警报传递回main。
  2. 回调将警报写入受锁定语句保护的列表。
  3. 等待所有任务完成。然后执行继续例程以将警报转发给客户端。
  4. 重新启动间隔计时器。
  5. 如果您需要在上传完成之前开始处理下一个时间间隔,您可以使用双缓冲方法写入一个List,将其提供给upload方法,然后开始将警报写入新List,在收集和上传警报时,在列表之间来回切换。