我曾通过使用Parallel.ForEach来并行处理我的项目,那时候效果还不错。但是主要开发人员出现了,他表示不喜欢这种方法并希望我改变。
之后,我决定使用TaskScheduler和TaskFactory来批量处理工作,结果非常完美快速,但他仍然认为这种做法过于繁琐老旧,建议我采用BlockingCollection与消费者/生产者模式。他开始实施这个方案,但我并不认为它比TaskScheduler更有优势,也许只是为了避免维护问题或保持适度的复杂性,我不知道。
在这里提供一些背景信息,这项工作是将数据从内存中转换,这些数据不需要同步上下文,每个操作都可以单独进行,没有IO限制,并且所有代码都是线程安全的。
那么,BlockingCollection和TaskScheduler在并行处理方面有什么区别呢?
之后,我决定使用TaskScheduler和TaskFactory来批量处理工作,结果非常完美快速,但他仍然认为这种做法过于繁琐老旧,建议我采用BlockingCollection与消费者/生产者模式。他开始实施这个方案,但我并不认为它比TaskScheduler更有优势,也许只是为了避免维护问题或保持适度的复杂性,我不知道。
在这里提供一些背景信息,这项工作是将数据从内存中转换,这些数据不需要同步上下文,每个操作都可以单独进行,没有IO限制,并且所有代码都是线程安全的。
那么,BlockingCollection和TaskScheduler在并行处理方面有什么区别呢?
IO bound
和异步的,这意味着Parallel.ForEach
不太适合。无论如何,你需要更多的信息,因为当前状态下这个问题很难回答。 - TheGeneralParallel.ForEach
已经实现了发布/订阅模式。发布者是输入的可枚举对象,订阅者则是工作线程。它非常适用于数据并行处理,但不支持异步和并发操作。并行处理 ≠ 异步 ≠ 并发。 - Panagiotis Kanavos