问题标签 [concurrentdictionary]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - 让我的 Parallel.ForEach 线程安全的更好方法?
我想让以下代码线程安全。不幸的是,我尝试在此代码中的各个级别进行锁定,但没有成功。我似乎可以实现线程安全的唯一实例是在整个循环周围放置一个锁,这有效地使 Parallel.ForEach 不会比仅使用 foreach 更快(甚至可能更慢)。该代码相对/几乎安全,没有锁定。在大约每 20 次左右的执行中,geneTokens.Value[-1] 键和 gtCandidates.Value[-1] 键的总和似乎只显示出细微的变化。
我意识到 Dictionary 不是线程安全的。但是,我不能将此特定对象更改为 ConcurrentDictionary 而不会对下游的性能造成重大影响。我宁愿使用常规 foreach 运行这部分代码,也不愿更改该特定对象。但是,我使用 ConcurrentDictionary 来保存各个 Dictionary 对象。我也尝试过进行此更改,但它并没有解决我的种族问题。
这是我的类级别变量:
这是 Parallel.ForEach:
c# - 锁定并发字典的值
分区是我创建的一个小类。我有数千个分区驻留在名为 Partitions 的 ConcurrentDictionary 中。在序列化之前,我想锁定一个特定的分区,做一些工作然后解锁分区。
在此期间,没有其他线程应该能够访问该分区。由于我的类 Partition 是一个引用类型,我想知道我是否可以像下面的代码中那样锁定单个 Partition 对象?
这会在下面的锁定期间阻塞来自 ConcurrentDictionary 分区中的单个分区的其他线程吗?
我不想使用类级别的储物柜对象进行锁定。我的思考过程是多个线程应该能够同时运行下面的代码。他们只是不应该能够访问特定的分区,如果它被锁定......
c# - 我应该如何在这个对象的 AddOrUpdate() 中实现 Func:ConcurrentDictionary>
如果该值是一个集合,如何AddorUpdate
在 ConcurrentDictionary 中实现以便我可以正确更新该值?
我担心的是,由于 TValue 是一种引用类型,我可能会遇到在竞争条件下多次调用 TValue 的情况。我自己会对此进行测试,但我的语法错误,所以我无法继续进行。
我必须改变什么才能使这项工作?
c# - 有界 BlockingCollections 在添加期间会丢失数据吗
我有一个 BlockingCollection(ConcurrentBag, 50000),我试图为生产者线程使用 50,000 的非常小的有界容量,以最大限度地增加我可以在消费者线程的 ConcurrentDictionary 中处理的记录数。生产者比消费者快得多,否则会消耗大部分内存。
不幸的是,我立即注意到我的 ConcurrentDictionary 中的记录总数现在大大低于在我的测试数据执行时添加 50,000 的有界容量后应有的记录数。我读到 BlockingCollection 的 .add 方法应该无限期地阻塞,直到集合中有空间可以执行添加。然而,情况似乎并非如此。
问题:
如果在 BlockingCollection 中的容量释放之前调用了太多 add 方法,BlockingCollection 的 .add 方法最终会超时还是静默失败?
如果 #1 的答案是肯定的,那么在超出 Bounding Capacity 后我可以尝试多少次添加而不丢失数据?
如果调用了许多 BlockingCollection .add() 方法,这些方法正在等待/阻塞容量并调用 CompleteAdding() 方法,那么那些等待/阻塞的添加会继续等待然后最终添加还是静默失败?
c# - ConcurrentDictionary.AddOrUpdate()
我正在尝试在 ConcurrentDictionary 类中使用 AddOrUpdate() 方法。我遇到了更新问题。以下是代码:
当/如果我用已经存在的键点击字典时,我想更新 pList 对象中包含的 3 个值。目前,只有最后一次迭代( p[2])在字典中被更新。我错过了什么?
c# - 将 TPL 与 ConcurrentDictionary 与“addValueFactory”一起使用有什么风险?MSDN 暗示线程问题
MSDN 对多线程环境中的 addValueFactory 进行了以下说明:
评论
如果您在不同的线程上同时调用 AddOrUpdate,则 addValueFactory 可能会被多次调用,但它的键/值对可能不会在每次调用时都添加到字典中。
对此有一个关闭的连接问题,但似乎没有做任何事情。当我阅读上面的摘录时,我猜想可能会发生以下其中一件事情:
Update() 方法被连续调用,直到它成功(可能会变成在高负载下应该避免的缓慢/争用。)
更新被丢弃,应用程序认为它成功了。(腐败)
数据在变量的线程本地副本上更新,而不是在其他线程上更新。(这可能有点牵强,但由于没有记录任何可能发生的事情)
谁能解释一下这句话是什么意思?
第2部分
@Douglas 共享我修改的代码。有趣的是,每个“添加”与每个“更新”被调用了多少次。输出很有趣,因为只有一个返回值中有一个“添加”值。尽管 Add 被多次调用,但所有其他人都“更新”了。
我想以某种方式阻止更新方法被调用。
输出
c# - 我应该如何在 ConcurrentDictionary 中“取消” AddOrUpdate?
我已经阅读了 MSDN 文档和这个博客,我需要以下逻辑:
为一个ConcurrentDictionary<string,bool>
- 如果字符串不存在,添加它,并确保我
True
在添加时将bool 设置为 - 如果字符串确实存在,则仅将 bool 更改为
True
false 。否则取消更新
我的用例
我有几个 DNS 域来扫描恶意软件。我实时检索的列表中很可能会有重复项。我以 100 个或更少的批次收到 DNS 域列表,并且将有超过 10,000 个域进行扫描。
我只想在每次迭代 10,000 个域时扫描一次 DNS 主机。Abool == true
表示它当前正在被扫描,我应该在继续之前取消该任务。有bool == false
或没有条目意味着我应该立即将条目更新为bool==true
或尽快创建一个新条目。
记住...
AddOrUpdate 将独立于 .NET4 的 TPL 中的许多独立线程调用。每个线程都需要决定它是否需要处理 Dictionary's key
... 中提到的值或继续下一个。只有一个“钥匙”应该对其进行处理。
我需要向调用线程发出更新成功或失败的信号。另外根据这个答案,AddOrUpdate 的函数似乎会被调用很多次。我认为这可能意味着我的调用线程会因为取消工作key
或继续工作而感到困惑。(记住只有一个线程可以积极工作key
可能混淆调用线程的并发更新示例
输出
问题
我应该如何将此“取消更新”功能添加到 AddOrUpdate?
c# - 使用 Linq 创建字典
如何使用 Linq创建一个Dictionary
(甚至更好的一个)?ConcurrentDictionary
例如,如果我有以下 XML
加载XDocument doc;
并想要填充一个ConcurrentDictionary<string, Info>
(其中键是名称,并且Info
是某个类持有地址和平均值。填充Info
现在不是我关心的问题),我该怎么做?
c# - 聚合/合并多个并发字典
所以我有一个这样定义的并发字典
我知道这似乎有点令人费解,但结构是有效的......
现在我的问题是,我已经为 x 个不同的来源说了 x 个这些字典的实例,出于统计目的,它们需要被合并/合并/聚合到一个相同结构的字典中......
有人对最佳方法有任何想法吗?我知道我可以创建一个相同结构的新字典;循环遍历要合并的每个字典,并在每个级别检查新字典中的这些键等,并根据该确定的结果添加或更新...
但这对我来说似乎有点笨拙......那里有任何可以伸出援助之手的 LINQ 天才吗?
[注意 - 我刚刚做了一个重要的编辑 - 输出字典与输入字典的结构完全相同]
c# - 我的代码会被击中吗?并发字典 TryGetValue(..)
如果我有一个并发字典,并且我尝试 TryGetValue,并且我测试它是否失败,我会做一些事情,但如果它没有失败,并且从 TryGetValue 函数检索到的值等于我尝试 TryGetValue 之前的值,我做点别的。
我的问题是,(假设我的 ConcurrentDicationary 中的任何内容都不会设置为默认值(DateTime)),我的第二个 if 语句会真正执行吗?还是鉴于目前的情况是不可能的?