首页 > 解决方案 > BlockingCollection 和 TaskScheduler 的区别

问题描述

我正在寻求并行化我的项目的一些工作,我首先使用了 Parallel.ForEach,它同时工作得很好,然后首席开发人员上来说他不太喜欢这个并想改变那个。

然后我决定沿着 TaskFactory 做一个 TaskScheduler 来批处理工作,完美无瑕地工作,但他又不喜欢它,觉得它过分老旧,他说我应该使用 BlockingCollection 和 Consumer/Producer 模式,他开始实施这和我看不出比 TaskScheduler 有什么优势。也许是为了维护问题,或者为了将复杂性保持在可接受的范围内,我不知道。

这里有一些上下文,工作是从内存中转换数据,数据不需要有同步上下文,每个操作可以单独进行,没有 IO 限制,所有代码都是线程安全的。

那么,并行工作的 BlockingCollection 和 TaskScheduler 有什么区别?

标签: c#

解决方案


那么,并行工作的 BlockingCollection 和 TaskScheduler 有什么区别?

正如评论所说,它们就像夜晚和橘子一样不同。BlockingCollection<T>是您在 Namespace 中找到的集合System.Collections.Concurrent。Wich 基本上包含所有内容,他们可以通过在每个合理的地方使用lock 语句System.Collections.Generic来完全保护免受竞争条件的影响。

如果您在此之外获得想要的收藏,他们无法从内部证明该收藏完全符合竞赛条件。只有使用这些集合的代码才能避免竞争条件(可能是 Array 和List<T>没有并发对应物的原因)。

他真的不喜欢这个

他又一次不喜欢它,发现它过分且陈旧,他说我应该将 BlockingCollection 与消费者/生产者模式一起使用

那么差异并不真正重要。选择不在你的掌控之中。

您(尚)不知道的其他地方有任何要求。或者“老狗不学新把戏”适用。


推荐阅读