c# - BlockingCollection 和 TaskScheduler 的区别
问题描述
我正在寻求并行化我的项目的一些工作,我首先使用了 Parallel.ForEach,它同时工作得很好,然后首席开发人员上来说他不太喜欢这个并想改变那个。
然后我决定沿着 TaskFactory 做一个 TaskScheduler 来批处理工作,完美无瑕地工作,但他又不喜欢它,觉得它过分老旧,他说我应该使用 BlockingCollection 和 Consumer/Producer 模式,他开始实施这和我看不出比 TaskScheduler 有什么优势。也许是为了维护问题,或者为了将复杂性保持在可接受的范围内,我不知道。
这里有一些上下文,工作是从内存中转换数据,数据不需要有同步上下文,每个操作可以单独进行,没有 IO 限制,所有代码都是线程安全的。
那么,并行工作的 BlockingCollection 和 TaskScheduler 有什么区别?
解决方案
那么,并行工作的 BlockingCollection 和 TaskScheduler 有什么区别?
正如评论所说,它们就像夜晚和橘子一样不同。BlockingCollection<T>
是您在 Namespace 中找到的集合System.Collections.Concurrent
。Wich 基本上包含所有内容,他们可以通过在每个合理的地方使用lock 语句System.Collections.Generic
来完全保护免受竞争条件的影响。
如果您在此之外获得想要的收藏,他们无法从内部证明该收藏完全符合竞赛条件。只有使用这些集合的代码才能避免竞争条件(可能是 Array 和List<T>
没有并发对应物的原因)。
他真的不喜欢这个
他又一次不喜欢它,发现它过分且陈旧,他说我应该将 BlockingCollection 与消费者/生产者模式一起使用
那么差异并不真正重要。选择不在你的掌控之中。
您(尚)不知道的其他地方有任何要求。或者“老狗不学新把戏”适用。
推荐阅读
- c# - 如何在打印任务完成时获得通知
- python - 填充仅支持 kwargs 进行初始化的嵌套对象?
- python - 如何摆脱多个 Python 安装 - Ubuntu 18.04.2 LTS
- android - 错误应用插件:“com.google.gsm.google-services”还添加了类路径“com.google.gms:google-services:4.2.0”
- python - 如何找到模板和旋转图像之间的正确点对应关系?
- salesforce - 如何使用 apex 修改任何字段的元数据
- c# - 将 WPF 应用程序迁移到 dotnet Core 3 后获取 TaskCancelledException
- spring - 我们如何使用hibernate作为orm单独的数据库和模式来构建一个spring mvc多租户应用程序
- amazon-web-services - 当目标群体不健康时得到 502
- python - python中是否有一个绘图包可以处理缺失值而不省略x轴值/标签/比例?