concurrentbag trytake方法,删除了哪个项目?
带有来自MSDN 尝试从ConcurrentBag>. 删除对象 我想知道它从袋子中删除对象的基础,根据我的理解词典添加和删除HashCode. 的作品 如果并发袋与哈希码无关,那么当对象值在添加和删除过程中会发生变化时会发生什么. 例如: public static IDictionary> SereverConnections = new ConcurrentDictionary>(); public class Student { public string FirstName { get; set; } Student student = new Student(); SereverConnections.Add(student.FirstName{"bilal"}); } // have change t
26 2024-04-25
编程技术问答社区
为什么Collections.Generic.Queue没有Synchronized方法而Collections.Queue有?
System.Collections.Queue班级有 返回线程安全队列实现的方法. 但是,通用的System.Collections.Generic.Queue没有Synchronized方法.在这一点上,我有两个问题: 为什么通用的人没有这种方法?这是一个框架API设计决定吗? 排队如何从 C1> 与 ConcurrentQueue class? 谢谢. 态 在编写多线程应用程序时,这种模式实际上并不有用. 大多数实际使用模式对同步集合不会受益;他们仍然需要围绕高级操作的锁. 因此,System.Collections中的Synchronized()方法实际上是一个引导人们编写非线程安全代码的陷阱. ConcurrentQueue类是专门为并发应用程序设计的,并包含有用的方法,可以原子修改队列. 并发收集软件包仅包含在多线程环境中使用的方法(例如,TryDequeue());他们将帮助您指导您编写实际上是线程安全的代码.
6 2024-04-20
编程技术问答社区
当不可变的集合比并发的集合更可取时
最近阅读了有关不变的收藏. 建议将它们用作读取的线程,当读取操作执行比写作更频繁时. 然后我想测试读取性能ImmutableDictionary vs ConcurrentDictionary.这是这个非常简单的测试(在.NET Core 2.1中): using System; using System.Collections.Concurrent; using System.Collections.Generic; using System.Collections.Immutable; using System.Diagnostics; using System.Linq; using System.Threading.Tasks; namespace ImmutableSpeedTests { class Program { public class ConcurrentVsImmutable {
8 2024-04-19
编程技术问答社区
为什么ConcurrentBag<T>没有实现ICollection<T>?
我有一种使用IList并添加内容的方法.我想通过它现在,我明白了为什么它不能(也许)实现IList - 它不是有序的集合,因此拥有索引器是没有意义的.但是我看不到任何那么,为什么?而且,.NET中是否有一个可以实现更强大的接口的线程安全集合? 解决方案 为什么不ConcurrentBag实现ICollection? 因为不能.特别是方法的功能 ConcurrentBag不支持.您无法从此集合中删除特定项目.您只能 ConcurrentBag是一个专门的系列,旨在支持特定场景(混合生产者 - 清理场景,主要是对象池).选择其内部结构是为了优化这些方案. ConcurrentBag内部维护一个 WorkStealingQueue (内部类)每个线程.物品始终将其推入当前线队列的尾部.物品是从当前线队列的尾部弹出的,除非其空,否则项目是从另一个线程队列的头部"被盗"的.从本地队列推出并弹出不含锁.这就是该集合旨在做到最好的:从本地缓冲
6 2024-04-17
编程技术问答社区
同时收集支持删除一个指定的项目?
非常简单:除了同意(如果需要的话,我会使用它,但这不是正确的概念),是否有任何并发​​集合(IproducerConsumer实现)支持基于项目的简单平等来删除特定项目或定义去除条件的谓词? 说明:我有一个多线程的多阶段工作流程算法,该算法从DB中拉出对象,并将它们粘在"启动"队列中.从那里开始,他们将在下一个阶段被抓住,进一步工作,然后塞入其他队列.这个过程延续了几个阶段.同时,第一个阶段再次被其主管调用,并将对象从数据库中拉出,这些对象可以包括仍在处理的对象(因为它们尚未完成处理,因此尚未重新使用标志集说明的标志.他们完成了). 我正在设计的解决方案是"工作中的主人"集合;当对象在第一个阶段进行处理时,将其排列在该队列中,并在将工作流的任何阶段完成必要的处理后将其重新保存到DB后被删除.当对象在该列表中,如果第一阶段重新退回该对象,它将被忽略. 我计划使用consturrentbag,但是唯一的删除方法(TryTake)从袋子中删除了任意项目,而不是指定的一个(co
2 2024-04-17
编程技术问答社区
在没有Thread.Sleep的情况下,并发的集合吃了太多的cpu
BlockingCollection或ConcurrentQueue的正确用法是什么,因此您可以自由使用螺纹而无需刻录一半或更多的CPU? 我使用2个线程进行了一些测试,除非我有一个线程.至少50〜100ms的leep始终将击中我的CPU的至少50%. 这是一个虚构的例子: private void _DequeueItem() { object o = null; while(socket.Connected) { while (!listOfQueueItems.IsEmpty) { if (listOfQueueItems.TryDequeue(out o)) { // use the data } } } } 在上面的示例中,我必须设置一个线程. 注意:我也尝试过一段时间以进
2 2024-04-15
编程技术问答社区
ConcurrentBag-Add Multiple Items?
是否有一种方法可以一次添加多个项目以一次汇总包,而不是一次添加一个项目?我在contrentbag上没有看到AddRange()方法,但是有一个contat().但是,这对我不起作用: ConcurrentBag objectList = new ConcurrentBag(); timeChunks.ForEach(timeChunk => { List newList = Foo.SomeMethod(x => x.SomeReadTime > timeChunk.StartTime); objectList.Concat(newList); }); 此代码曾经在Parallel.Foreach()中,但是我将其更改为上面,因此我可以对其进行故障排除.变量新列表确实具有对象,但是在objectList.concat line之后,对象列表中总是包含0个对象. concat 不起作用吗?我是否需要使用add()方法一次将项目添加
0 2024-04-14
编程技术问答社区
在ConcurrentDictionary AddOrUpdate中为更新部分添加什么?
我正在尝试使用字典来重新编写一些代码以使用contrentDictionary.我已经审查了一些示例,但是在实现Addorupdate函数时仍遇到困难.这是原始代码: dynamic a = HttpContext; Dictionary userDic = this.HttpContext.Application["UserSessionList"] as Dictionary; if (userDic != null) { if (useDic.ContainsKey(authUser.UserId)) { userDic.Remove(authUser.UserId); } } else { userDic = new Dictionary(); } userDic.Add(authUse
2 2024-04-14
编程技术问答社区
为什么.Net(4.0)中的ConcurrentBag<T>如此缓慢?我做错了吗?
在启动一个项目之前,我写了一个简单的测试,以比较(System.Collections.concurrent)相对于锁定和列表的ConcurrentBag的性能.令我感到非常惊讶的是,consturrentbag速度慢了10倍以超过10倍的锁定列表.据我了解,当读者和作者是同一线程时,consurrentbag效果最好.但是,我没有认为它的性能会比传统锁差得多. 我已经运行了一个带有两个并行的测试,用于循环编写和从列表/包中读取.但是,文字本身显示出巨大的区别: private static void ConcurrentBagTest() { int collSize = 10000000; Stopwatch stopWatch = new Stopwatch(); ConcurrentBag bag1 = new ConcurrentBag(); stopWatch.Start(
6 2024-04-12
编程技术问答社区
如何用ConcurrentQueue<T>进行线程工作?
我试图弄清楚与队列一起工作的最佳方法.我有一个返回数据表的过程.反过来,每个数据词都与先前的数据词合并.有一个问题,直到最终的散装(OutofMemory)才能保留太多的记录. 因此,我已经确定我应该立即处理每个传入的数据.考虑ConcurrentQueue ...但是我看不到WriteQueuedData()方法如何知道表格并将其写入数据库. 例如: public class TableTransporter { private ConcurrentQueue tableQueue = new ConcurrentQueue(); public TableTransporter() { tableQueue.OnItemQueued += new EventHandler(WriteQueuedData); // no events available }
6 2024-04-11
编程技术问答社区
ConcurrentBag的正确用法是什么?
我已经在此处阅读了有关ConcurrentBag的先前问题,但在多线程中没有找到实际实现样本. conturrentbag是一个线程安全袋实现,对方案进行了优化,其中相同的线程将同时生产和消耗存储在袋中的数据." 当前这是我的代码中当前用法(这是简化的,而不是实际代码): private void MyMethod() { List products = GetAllProducts(); // Get list of products ConcurrentBag myBag = new ConcurrentBag(); //products were simply added here in the ConcurrentBag to simplify the code //actual code process each product before adding in the b
12 2024-04-11
编程技术问答社区
如何使在ConcurrentHashMap线程中更新BigDecimal变得安全?
我正在制作一个申请,该应用程序需要一堆日记帐条目并计算总和. 在这样做的下方是线程/并发安全,当有多个线程调用addToSum()方法.我想确保每个呼叫都正确更新总计. 如果不安全,请说明我该怎么做才能确保线程安全. 我需要synchronize get/put还是有更好的方法? private ConcurrentHashMap sumByAccount; public void addToSum(String account, BigDecimal amount){ BigDecimal newSum = sumByAccount.get(account).add(amount); sumByAccount.put(account, newSum); } 非常感谢! 更新: 感谢大家的答案,我已经知道上面的代码是不是线程安全. 感谢Vint建议AtomicReference作为sy
0 2024-03-30
编程技术问答社区
ConcurrentBag与List的性能比较
前言:我只是在问这个 问题:给定List> List>? 的枚举或多或少地枚举 解决方案 ConcurrentBag不可避免地比List少.尽管您只会从单个线程访问它,但该结构仍然需要采用机制来防止种族危害的可能性,应同时出现. 如果您将在开始枚举之前从单个线程中加载集合,则可以通过使用ConcurrentBag(IEnumerable)构造函数避免性能开销,而不是通过其方法. ConcurrentBag提供枚举的"时机快照"语义;请参阅其 GetEnumerator GetEnumerator 方法.当您从foreach循环访问ConcurrentBag时,它将首先将其整个内容复制到普通List中,然后对其进行枚举.每次您在循环中使用它时,这都会产生大量性能开销(包括计算和内存). 如果您的方案是您的列表将被多个线程填充,但是仅通过一个线程读取,则一旦作者完成后,您就应该将其转换为List. 其他解决
22 2024-01-05
编程技术问答社区
SynchronizedCollection<T>和其他并发集合的区别是什么?
SynchronizedCollection和System.Collections.Concurrent名称空间中的并发集合彼此不同,除了并发集合是一个名称空间,SynchronizedCollection是类? SynchronizedCollection以及并发集合中的所有类都提供线程安全集合.我如何决定何时使用另一个,为什么? 解决方案 /a>首先在.NET 2.0中引入,以提供线程安全收集类.它通过锁定来做到这一点,因此您本质上具有List,其中每个访问都包裹在lock语句中. System.Collections.Concurrent 命名空间更新了.它直到.NET 4.0才引入,它包括一套大幅改进和更多样化的选择.这些类不再使用锁提供线程安全性,这意味着在多个线程同时访问数据的情况下,它们应该更好地扩展.但是,在这些选项中明显没有实现IList接口的类. 因此,如果您要定位.NET框架的4.0版,则应尽可能使用Syste
ConcurrentBag是导致内存泄漏的原因吗?
可能的重复: concurrentbag中可能的memoryLeak? 我的应用中有史诗般的内存泄漏.我从未收集过其中一种方法中的所有数据,这些数据都从未收集过. . 这个简单的代码证明了我如何使用它: void Main() { var l = new List(){1,2,3,4}; Func(l); l.Clear(); l=null; } void Func(List list) { var bag = new ConcurrentBag(); Parallel.ForEach(list, k=> bag.Add(++k)); list.Clear(); foreach(int i in bag) //I know, I doing it wrong. { list.Add(i); } } 我期望的是:袋子将被创建并在方法" f
38 2023-10-14
编程技术问答社区
如何访问一个阻塞集合的底层默认并发队列?
我有多个生产商和一个消费者.但是,如果队列中尚未消耗的东西,生产商不应再次排队. (唯一使用默认并发队列的唯一无重复阻止集合) if (!myBlockingColl.Contains(item)) myBlockingColl.Add(item) 但是,阻止集合没有包含方法,也没有提供任何类型的TryPeek()类似方法.我如何访问基础的并发队列,以便我可以做 之类的事情 if (!myBlockingColl.myConcurQ.trypeek(item) myBlockingColl.Add(item) 在尾巴中? 解决方案 这是一个有趣的问题.这是我第一次看到有人要求忽略重复的阻塞队列.奇怪的是,我找不到像您想要的BCL中已经存在的那样.我说这很奇怪,因为BlockingCollection可以接受IProducerConsumerCollection作为基础集合,该集合具有TryAdd方法,该方法在检测到重复项时被广告宣传为能够失败.问题在
具有固定尺寸FIFO队列的生产者/消费者模式
我需要在固定尺寸的FIFO队列周围实现生产者/消费者模式.我认为围绕同时符号的包装班可能会为此起作用,但我不确定(而且我以前从未使用过同意的词).这样的扭曲是,队列只需要容纳固定数量的项目(在我的情况下).我的应用程序将具有一个生产者任务/线程和一个消费者任务/线程.当我的消费者任务运行时,它需要在那一刻时排出队列中存在的所有项目并处理它们. 对于它的价值,我的消费者处理排队的项目不过是通过SOAP上传到不是100%可靠的Web应用程序上的.如果无法建立连接或呼叫肥皂呼叫失败,我应该丢弃这些项目,然后返回队列以获取更多信息.由于肥皂的开销,我试图最大化我可以在一个肥皂呼叫中发送的队列数量. 有时,我的生产商可能会比消费者能够删除和处理它们更快地添加项目.如果队列已经满满并且我的生产者需要添加另一个项目,则我需要加入新项目,但然后将最古老的物品排列,以使队列的大小保持固定.基本上,我需要保留始终在队列中生产的最新项目(即使这意味着某些物品不会被消耗,因为我的消费者目前正在处理以
28 2023-07-18
编程技术问答社区
为什么C#中没有并发的集合?
我试图概述C#集合背后的线程安全理论. 为什么Java中没有并发收藏? ( java docs ).有些收藏看起来很安全,但我不清楚的是什么位置,例如: 复合操作, 使用迭代器的安全性, 写操作 我不想重新发明轮子! (我不是一个多线程大师,而且绝对不会低估这将有多难). 我希望社区可以提供帮助. 解决方案 .net到现在为止具有相对"低级别"的并发支持 - 但是.NET 4.0介绍 Andrew的答案当然在.NET 4.0之前如何处理集合 - 对于 使用,当访问"正常"共享集合时,我只是适当地锁定.但是,并发收集使使用生产商/消费者队列等 其他解决方案 c#提供了几种方法来处理跨多个线程的集合.对于这些技术的良好文章,我建议您从集合和同步(线程安全): 默认情况下,集合课是 通常不安全.多种的 读者可以阅读该集合 信心;但是,任何修改 到该系列会产生不确定的 所有访问线程的结果 该系列,包括读者 线程. 可以将收集课程进行线程 安
12 2023-04-06
编程技术问答社区
ConcurrentQueue<StrongBox<T>>的用法
我基本上是在寻找从摄像头中获取的图像收集容器.由于Contrentqueue是线程安全的,因此我想使用它.但是,在调试我的代码时,我发现本文说 如果元素很小,您可能永远不会注意到这一点.如果, 但是,这些元素坚持大量资源(例如,每个元素都是 一个巨大的图像位图),您可能会看到这一点的影响 (一个解决方法是排队包装对象,例如 ConcurrentQueue>而不是ConcurrentQueue,并且 null null null null the包装器具有后对t值的引用 被脱水). 据我所知,StrongBox是一种原始价值的包装器.这是否意味着我必须存储另一个图像的集合? 所以我正在寻找用法或ConcurrentQueue>.的示例ConcurrentQueue>.我从Google中找到的唯一一件事是 解决方案 提醒提出过早优化的危险是在评论中,因此我将讨论这里发生的事情的语义.
28 2023-02-10
编程技术问答社区
SynchronizedCollection<T>和其他并发集合的区别是什么?
SynchronizedCollection和System.Collections.Concurrent名称空间中的并发集合彼此不同,除了并发集合是一个名称空间,SynchronizedCollection是类? SynchronizedCollection以及并发集合中的所有类都提供线程安全集合.我如何决定何时使用另一个,为什么? 解决方案 /a>首先在.NET 2.0中引入,以提供线程安全的集合类.它通过锁定来做到这一点,因此您本质上具有List,其中每个访问都包裹在lock语句中. System.Collections.Concurrent 命名空间要新.它直到.NET 4.0才引入,它包括一套大大改进和更多样化的选择.这些类不再使用锁提供线程安全性,这意味着在多个线程同时访问数据的情况下,它们应该更好地扩展.但是,在这些选项中明显不存在实现IList接口的类. 因此,如果您要定位.NET框架的4.0版,则应在可能的情况下使用
30 2023-02-06
编程技术问答社区