Tag: concurrentdictionary

有什么能比Concurrent集合更好地解决这个multithreading场景

我有一个持久的B +树,多个线程正在读取树的不同块并对读取数据执行一些操作。 有趣的部分:每个线程产生一组结果,作为最终用户,我想在一个地方看到所有结果。 我做了什么:一个ConcurentDictionary和所有线程正在写它。 这一切都很顺利。 但是应用程序是时间关键的,一秒钟意味着完全不满意。 与Dictionary相比,ConcurentDictionary因为线程安全开销本质上很慢。 我可以使用Dictionary,然后每个线程都会将结果写入不同的词典。 但是我会遇到合并不同词典的问题。 。 我的问题: 并发集合是否适合我的场景? 如果不是(1),那么我将如何合并最佳不同的词典。 鉴于此, (a)逐个复制项目和(b) LINQ是已知的解决方案,并不像预期的那样最佳:) 如果不是(2);-)你会建议什么? 。 快速信息: #Thread = processorCount。 应用程序可以在标准笔记本电脑(即4个线程)或高端服务器(即<32个线程)上运行 物品数量。 该树通常拥有超过1.0E + 12项。

.NET ConcurrentDictionary.ToArray()ArgumentException

当我调用ConcurrentDictionary.ToArray时,有时会收到以下错误。 错误如下: System.ArgumentException:索引等于或大于数组的长度,或者字典中的元素数大于从索引到目标数组末尾的可用空间。 在System.Collections.Concurrent.ConcurrentDictionary 2.System.Collections.Generic.ICollection<System.Collections.Generic.KeyValuePair>.CopyTo(KeyValuePair在System.Linq.Buffer 1..ctor(IEnumerable 2.System.Collections.Generic.ICollection<System.Collections.Generic.KeyValuePair>.CopyTo(KeyValuePair 2 []数组,Int32索引) System.Linq.Enumerable.ToArray [TSource](IEnumerable 1 source) at …Cache.SlidingCache (IEnumerable 1 source) at …Cache.SlidingCache (Object state)in … \ SlidingCache.cs:line 141 at在System.Threading.QuereadingUserWorkItemCallback.System上的System.Threading.ExecutionContext.Run(ExecutionContext executionContext,ContextCallback回调,Object状态,Boolean preserveSyncCtx)中的System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext,ContextCallback callback,Object state,Boolean preserveSyncCtx)。 System.Threading.ThreadPoolWorkQueue.Dispatch()中的Threading.IThreadPoolWorkItem.ExecuteWorkItem() 我注意到在multithreading场景中,有时在对ConcurrentDictionary进行排序时会出现exception。 请参阅堆栈溢出问题。 所以我在排序之前开始使用ConcurrentDictionary.ToArray。 在创建arrays时似乎仍然存在问题。 并发字典用于缓存,当达到缓存的设置的最大元素数时,该缓存维护对象并刷新最后访问的对象。 多个线程访问缓存,并且在尝试删除旧元素时会发生上述错误,因此可以将新元素添加到arrays中。 请参阅下面的一些代码段: public class SlidingCache : IDictionary { public int MinCount { get; private set; } […]

在System.Collections.Concurrent.ConcurrentDictionary中防御竞争条件

.NET ConcurrentDictionary容易受到可能导致意外数据的竞争条件的影响,如本MSDN文章底部所述。 我假设有几个因素需要考虑。 问:我应该如何编写不易受可能导致数据丢失的竞争条件的代码? 在我的场景中,我有一个输入流,它具有一个不断增加的索引(n ++)。 我的想法是,如果竞争条件发生,我可以检测到丢失的数据并重新发送。 另一方面,可能有更好的方法来做到这一点,我不知道。

如何将ConcurrentDictionary转换为Dictionary?

我有一个ConcurrentDictionary对象,我想将其设置为Dictionary对象。 不允许在他们之间施放。 那我该怎么做?

元组vs字符串作为C#中的字典键

我有一个使用ConcurrentDictionary实现的缓存,我需要保留的数据取决于5个参数。 所以从缓存中获取它的方法是:(为简单起见,这里仅显示3个参数,我更改了数据类型以表示CarData的清晰度) public CarData GetCarData(string carModel, string engineType, int year); 我想知道什么类型的密钥在我的ConcurrentDictionary中更好用,我可以这样做: var carCache = new ConcurrentDictionary(); // check for car key bool exists = carCache.ContainsKey(string.Format(“{0}_{1}_{2}”, carModel, engineType, year); 或者像这样: var carCache = new ConcurrentDictionary<Tuple, CarData>(); // check for car key bool exists = carCache.ContainsKey(new Tuple(carModel, engineType, year)); 我不会将这些参数一起用于任何其他地方,因此没有理由创建一个类来保持它们在一起。 我想知道哪种方法在性能和可维护性方面更好。

缓存异步操作

我正在寻找一种缓存异步操作结果的优雅方法。 我首先有一个像这样的同步方法: public String GetStuff(String url) { WebRequest request = WebRequest.Create(url); using (var response = request.GetResponse()) using (var sr = new StreamReader(response.GetResponseStream())) return sr.ReadToEnd(); } 然后我让它异步: public async Task GetStuffAsync(String url) { WebRequest request = WebRequest.Create(url); using (var response = await request.GetResponseAsync()) using (var sr = new StreamReader(response.GetResponseStream())) return await sr.ReadToEndAsync(); } 然后我决定我应该缓存结果,所以我不需要经常在外面查询: ConcurrentDictionary _cache […]

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

我使用并发字典作为线程安全的静态缓存,并注意到以下行为: 来自GetOrAdd上的MSDN文档 : 如果在不同的线程上同时调用GetOrAdd,可能会多次调用addValueFactory,但是对于每次调用,它的键/值对可能不会添加到字典中。 我希望能够保证工厂只被召唤一次。 是否有任何方法可以使用ConcurrentDictionary API执行此操作而无需借助我自己的单独同步(例如锁定valueFactory)? 我的用例是valueFactory在动态模块中生成类型,所以如果同时运行同一个键的两个valueFactories,我点击: System.ArgumentException: Duplicate type name within an assembly.