Meh*_*ANI 18 .net c# multithreading task-parallel-library
一个图像说的不仅仅是文字,所以这里基本上就是我想要实现的目标:(
为了简洁起见,我还使用了水果类比)

我过去很多次使用不同的.Net类之王(BackGroundWOrkers,ThreadPool,Self Made Stuff ......)做过这种事情.
我在这里要求提供建议并获得有关如何有效地做到这一点的新想法.
这是一个高计算程序,因此我收到数百万(结构相似但内容不相似)的数据,这些数据必须排队才能根据其内容类型进行处理.因此,我想避免为每个要处理的单个数据创建并行任务(这会使CPU过载并且设计不佳恕我直言).这就是为什么我想到只有一个线程为EACH数据TYPE运行,专门用于处理它(知道"Press Juice"方法是通用的并且独立于要按下的水果)
欢迎任何想法和实施建议.
我可以自由地提供任何进一步的细节.
spe*_*der 19
TPL DataFlow似乎是一个非常强大的候选人.
如果您真正想要的是每种类型的水果的一个线程(或一个恒定数量的线程),那么最简单的解决方案可能是BlockingCollection对每种类型的水果使用a .您的数据总线将为这些集合提供水果,您的处理线程将从中获取.但这意味着如果现在没有苹果,线程将被阻止,什么都不做.
更灵活和有效的方法是使用TPL Dataflow.有了这个,你不使用线程或任务,你使用块.例如,你的Thread C可以表示为a TransformBlock<Apple, AppleJuice>.
默认情况下,每个块最多使用一个线程,但可以轻松配置它们以使用更多线程(通过设置MaxDegreeOfParallelism).此外,数据流块可以很好地与新的C#5.0一起使用async- await这可能是一个很大的优势.
还有一些你应该小心的事情.例如,默认情况下,TDF针对吞吐量而非延迟进行了优化.因此,如果你的线程池很忙并且你有很多橙子进来而且只有一个苹果,那么苹果可能只在所有橙子被处理后才会被处理掉.但这也可以通过正确配置块(通过设置MaxMessagesPerTask)来解决.
| 归档时间: |
|
| 查看次数: |
7109 次 |
| 最近记录: |