问题标签 [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.
task - 最终 ContinueWith 完成后如何从 ConcurrentDictionary 中删除项目
首先,有 1500 多个“声誉”的人可以为“ContinueWith”创建一个标签(并用它标记这个问题)吗?谢谢!
很抱歉这篇文章的长度,但我不想浪费任何人试图帮助我的时间,因为我遗漏了相关细节。也就是说,它仍然可能发生。:)
现在是细节。我正在开发一个订阅几个 ActiveMQ 队列主题的服务。其中两个主题有些相关。一种是“公司更新”,一种是“产品更新”。两者的“ID”都是 CompanyID。公司主题包括产品主题中的数据。必需,因为其他订阅者需要产品数据但不想/不需要订阅产品主题。由于我的服务是多线程的(超出我们判断的要求),当消息到达时,我添加了一个任务以使用 AddOrUpdate处理ConcurrentDictionary中的每一个,其中更新参数只是一个ContinueWith(见下文)。这样做是为了防止可能发生的同时更新,因为这些主题和订阅者是“持久的”,因此如果我的侦听器服务离线(无论出于何种原因),我们可能会以同一 CompanyID 的多条消息(公司和/或产品)结束。
现在,我的实际问题(终于!)在任务(无论是一个任务,还是 ConcurrentWith 任务链中的最后一个)完成后,我想将它从 ConcurrentDictionary 中删除(显然)。如何?我已经想到并从同事那里得到了一些想法,但我并不真正喜欢其中任何一个。我不会列出这些想法,因为您的答案可能是我有但不喜欢的想法之一,但它最终可能是最好的。
与我的描述不同,我试图压缩代码片段以防止您不得不上下滚动太多。:)
nrtq = 与问题无关
谢谢!
c# - ConcurrentDictionary.TryAdd 会失败吗?
这更像是一个学术问题......但是ConcurrentDictionary.TryAdd会失败吗?如果是这样,在什么情况下,为什么?
visual-studio-2010 - VS C++ 中的 ConcurrentDictionary->AddOrUpdate
我正在使用 Visual Studio 2010 C++ Express 并且我想向我的 ConcurrentDictionary 添加一个项目:
我有这样的代码:
AddOrUpdate 方法需要 3 个参数,不像普通的字典 2。
微软网站说它需要这样的论点:
在微软网站上,我还发现了 C# 中的代码:
但它在 C++ 中不起作用。我必须把什么作为第三个论点?
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)
c# - 添加到 ConcurrentDictionary 的项目立即进入僵尸状态
我正在尝试使用Alchemy Websockets组合一个快速的小程序,该程序在其示例中使用 ConcurrentDictionary 集合。
在我编写的代码中,我试图将一个新客户端添加到 ConcurrentDictionary。我注意到我的脚本在尝试访问此客户端时在其他区域失败,并将其缩小到我添加到 ConcurrentDictionary 的项目立即进入“僵尸”状态。
这是我添加客户端的测试代码:
如果我使用调试器在该区域中断,我可以看到“测试”包含正确的客户端信息,但在将其添加到客户端集合后立即显示“对象处于僵尸状态。(来自 HRESULT 的异常:0x8013134F)” .
字典在我的类中声明如下:
我知道我可能正在做一些愚蠢的事情,但是什么给了?
c# - AddOrUpdate-ing 时锁定 ConcurrentDictionary?
我使用 aConcurrentDictioanry<string, HashSet<string>>
跨多个线程访问一些数据。
我在这篇文章(向下滚动)中读到该方法AddOrUpdate
不是在锁中执行的,因此它可能会危及线程安全。
我的代码如下:
我是否应该将AddOrUpdate
调用附在lock
语句中以确保一切都是线程安全的?
c# - 如何更新存在于另一个 ConcurrentDictionary 中的 ConcurrentDictionary?
我有一个以 Pr_Matrix 命名的 ConcurrentDictionary:
以下代码的目的是将data_set.Set_of_Point数据集中每对点之间的相似度值添加到该字典中。
我无法更新存在于主 ConcurrentDictionary 中的 ConcurrentDictionarys。
c# - 从 ConcurrentDictionary 中获取值
如果我有这个 ConcurrentDictionary:
有谁知道Owner
如果我已经拥有的价值,我将如何获得价值Context
?基本上我想使用Context
. 谢谢。
c# - 为什么 ConcurrentDictionary.GetOrAdd(key, valueFactory) 允许 valueFactory 被调用两次?
我正在使用并发字典作为线程安全的静态缓存,并注意到以下行为:
如果您在不同的线程上同时调用 GetOrAdd,则 addValueFactory 可能会被多次调用,但它的键/值对可能不会在每次调用时都添加到字典中。
我希望能够保证工厂只被调用一次。有没有什么方法可以用 ConcurrentDictionary API 做到这一点,而无需借助我自己的单独同步(例如锁定在 valueFactory 内)?
我的用例是 valueFactory 在动态模块中生成类型,因此如果同一键的两个 valueFactories 同时运行,我会点击:
System.ArgumentException: Duplicate type name within an assembly.
c# - 扩展方法获取“方法没有重载”错误
我最近刚刚将这个项目从 ASP.Net 3.5 升级到 4.0,这样我就可以使用 concurrentDictionary 而不是 Dictionary 因为线程安全特性。
为了使用它,我使用帮助论坛中的代码创建了一个扩展。
这一切都非常接近工作,我不知道如何修改扩展以使其正常工作。
这是代码:
以及扩展中的代码:
这是我收到的错误:
错误 1 方法“ToConcurrentDictionary”没有重载需要 2 个参数
在这种情况下,我需要修改什么扩展才能工作?非常感谢任何建议。