问题标签 [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.

0 投票
1 回答
422 浏览

task - 最终 ContinueWith 完成后如何从 ConcurrentDictionary 中删除项目

首先,有 1500 多个“声誉”的人可以为“ContinueWith”创建一个标签(并用它标记这个问题)吗?谢谢!

很抱歉这篇文章的长度,但我不想浪费任何人试图帮助我的时间,因为我遗漏了相关细节。也就是说,它仍然可能发生。:)

现在是细节。我正在开发一个订阅几个 ActiveMQ 队列主题的服务。其中两个主题有些相关。一种是“公司更新”,一种是“产品更新”。两者的“ID”都是 CompanyID。公司主题包括产品主题中的数据。必需,因为其他订阅者需要产品数据但不想/不需要订阅产品主题。由于我的服务是多线程的(超出我们判断的要求),当消息到达时,我添加了一个任务以使用 AddOrUpdate处理ConcurrentDictionary中的每一个,其中更新参数只是一个ContinueWith(见下文)。这样做是为了防止可能发生的同时更新,因为这些主题和订阅者是“持久的”,因此如果我的侦听器服务离线(无论出于何种原因),我们可能会以同一 CompanyID 的多条消息(公司和/或产品)结束。

现在,我的实际问题(终于!)在任务(无论是一个任务,还是 ConcurrentWith 任务链中的最后一个)完成后,我想将它从 ConcurrentDictionary 中删除(显然)。如何?我已经想到并从同事那里得到了一些想法,但我并不真正喜欢其中任何一个。我不会列出这些想法,因为您的答案可能是我有但不喜欢的想法之一,但它最终可能是最好的。

与我的描述不同,我试图压缩代码片段以防止您不得不上下滚动太多。:)

nrtq = 与问题无关

谢谢!

0 投票
3 回答
30984 浏览

c# - ConcurrentDictionary.TryAdd 会失败吗?

这更像是一个学术问题......但是ConcurrentDictionary.TryAdd会失败吗?如果是这样,在什么情况下,为什么?

0 投票
1 回答
1032 浏览

visual-studio-2010 - VS C++ 中的 ConcurrentDictionary->AddOrUpdate

我正在使用 Visual Studio 2010 C++ Express 并且我想向我的 ConcurrentDictionary 添加一个项目:

我有这样的代码:

AddOrUpdate 方法需要 3 个参数,不像普通的字典 2。

微软网站说它需要这样的论点:

在微软网站上,我还发现了 C# 中的代码:

但它在 C++ 中不起作用。我必须把什么作为第三个论点?

0 投票
2 回答
3064 浏览

c# - 在更新时排序和显示时在并发字典中获取参数异常

我在以下程序中遇到难以重现的错误,其中多个线程并行更新并发字典,并且主线程在固定时间间隔后按排序顺序显示字典的状态,直到所有更新线程完成。

该函数有一个字符流列表和一个输出器。该函数维护从每个字符流(并行)读取的单词的单词频率的并发字典。单词被一个新线程读入,主线程每 1 毫秒输出字典的当前状态(按排序顺序),直到所有输入流都被读取(实际上输出将类似于每 10 秒,但错误似乎只出现在非常小的值上)。WriteBatch 函数只是写入控制台:

大多数执行都很好,但有时我在 WriteBatch 函数的 foreach 语句中收到以下错误:

“未处理的异常:System.ArgumentException:索引等于或大于数组的长度,或者字典中的元素数大于从索引到目标数组末尾的可用空间。”

如果主线程在启动更新线程之后和开始显示循环之前休眠一小会儿,错误似乎确实消失了。如果删除 orderby 子句并且字典未在 linq 查询中排序,它似乎也消失了。有什么解释吗?

WriteBatch 函数中的foreach (var tuple in batch)语句给出了错误。堆栈跟踪如下:

未处理的异常:System.ArgumentException:索引等于或大于数组的长度,或者字典中的元素数大于从索引到目标数组末尾的可用空间。在 System.Collections.Concurrent.ConcurrentDictionary2.System.Collections.Generic.ICollection>.CopyTo(KeyValuePair2[] 数组,Int32 索引) 在 System.Linq.Buffer1..ctor(IEnumerable1 源) 在 System.Linq.OrderedEnumerable1。 d__0.MoveNext() at System.Linq.Enumerable.WhereSelectEnumerableIterator2.MoveNext() at MyProject.ConsoleOutputter.WriteBatch(IEnumerable1 batch) in C:\MyProject\ConsoleOutputter.cs:line 10 at MyProject.Function(IEnumerable1 characterReaders, IOutputter outputter)

0 投票
1 回答
632 浏览

c# - 添加到 ConcurrentDictionary 的项目立即进入僵尸状态

我正在尝试使用Alchemy Websockets组合一个快速的小程序,该程序在其示例中使用 ConcurrentDictionary 集合。

在我编写的代码中,我试图将一个新客户端添加到 ConcurrentDictionary。我注意到我的脚本在尝试访问此客户端时在其他区域失败,并将其缩小到我添加到 ConcurrentDictionary 的项目立即进入“僵尸”状态。

这是我添加客户端的测试代码:

如果我使用调试器在该区域中断,我可以看到“测试”包含正确的客户端信息,但在将其添加到客户端集合后立即显示“对象处于僵尸状态。(来自 HRESULT 的异常:0x8013134F)” .

字典在我的类中声明如下:

我知道我可能正在做一些愚蠢的事情,但是什么给了?

0 投票
4 回答
5933 浏览

c# - AddOrUpdate-ing 时锁定 ConcurrentDictionary?

我使用 aConcurrentDictioanry<string, HashSet<string>>跨多个线程访问一些数据。

我在这篇文章(向下滚动)中读到该方法AddOrUpdate不是在锁中执行的,因此它可能会危及线程安全。

我的代码如下:

我是否应该将AddOrUpdate调用附在lock语句中以确保一切都是线程安全的?

0 投票
1 回答
787 浏览

c# - 如何更新存在于另一个 ConcurrentDictionary 中的 ConcurrentDictionary?

我有一个以 Pr_Matrix 命名的 ConcurrentDictionary:

以下代码的目的是将data_set.Set_of_Point数据集中每对点之间的相似度值添加到该字典中。

我无法更新存在于主 ConcurrentDictionary 中的 ConcurrentDictionarys。

0 投票
4 回答
13388 浏览

c# - 从 ConcurrentDictionary 中获取值

如果我有这个 ConcurrentDictionary:

有谁知道Owner如果我已经拥有的价值,我将如何获得价值Context?基本上我想使用Context. 谢谢。

0 投票
2 回答
6626 浏览

c# - 为什么 ConcurrentDictionary.GetOrAdd(key, valueFactory) 允许 valueFactory 被调用两次?

我正在使用并发字典作为线程安全的静态缓存,并注意到以下行为:

来自GetOrAdd 上的 MSDN 文档

如果您在不同的线程上同时调用 GetOrAdd,则 addValueFactory 可能会被多次调用,但它的键/值对可能不会在每次调用时都添加到字典中。

我希望能够保证工厂只被调用一次。有没有什么方法可以用 ConcurrentDictionary API 做到这一点,而无需借助我自己的单独同步(例如锁定在 valueFactory 内)?

我的用例是 valueFactory 在动态模块中生成类型,因此如果同一键的两个 valueFactories 同时运行,我会点击:

System.ArgumentException: Duplicate type name within an assembly.

0 投票
3 回答
543 浏览

c# - 扩展方法获取“方法没有重载”错误

我最近刚刚将这个项目从 ASP.Net 3.5 升级到 4.0,这样我就可以使用 concurrentDictionary 而不是 Dictionary 因为线程安全特性。

为了使用它,我使用帮助论坛中的代码创建了一个扩展。

这一切都非常接近工作,我不知道如何修改扩展以使其正常工作。

这是代码:

以及扩展中的代码:

这是我收到的错误:

错误 1 ​​方法“ToConcurrentDictionary”没有重载需要 2 个参数

在这种情况下,我需要修改什么扩展才能工作?非常感谢任何建议。