gpt4 book ai didi

c# - 并行 ForEach 和 ConcurrentBag

转载 作者:行者123 更新时间:2023-11-30 19:39:56 26 4
gpt4 key购买 nike

我有一个 ConcurrentBag暴露于 Parallel.ForEach 内的读/写操作.基本上,我需要根据几个属性检查包中是否存在该对象,如果不匹配,则将其添加到包中。真的,真的很慢。使用 List<>没有锁是时间的一小部分。这段代码有什么问题?我最好使用带有 ReaderWriterLockSlim 的列表锁定吗? ?我在这里处理大约 1,000,000 个对象。

var bag = new ConcurrentBag<Beneficiary>();

Parallel.ForEach(cx, _options, line =>
{
if (!bag.Any(o =>
o.WinID == beneficiary.WinID &&
o.ProductType == beneficiary.ProductType &&
o.FirstName == beneficiary.FirstName &&
o.LastName == beneficiary.LastName &&
o.MiddleName == beneficiary.MiddleName))
{
bag.Add(beneficiary);
}
}

最佳答案

A ConcurrentBag<T>未针对此类场景进行优化。它是使用 ThreadLocal<T> 实现的这会使您的特定用例变慢。您在多个线程上重复遍历整个集合。遍历整个集合以检查对象是否存在也很慢。

我建议重载 Beneficiary.GetHashCode并使用 ConcurrentDictionary<Beneficiary, byte> .字节值可以忽略,它实际上是一个并发哈希集。

关于c# - 并行 ForEach 和 ConcurrentBag,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25650770/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com