C# ConcurrentBag实现】的更多相关文章

转载自MSDN. ConcurrentBag<T> 类型公开以下成员. 方法     显示: 继承 保护   名称 说明 Add 将对象添加到 ConcurrentBag<T> 中. CopyTo 从指定数组索引开始,将 ConcurrentBag<T> 元素复制到现有的一维 Array 中. Equals(Object) 确定指定的 Object 是否等于当前的 Object. (继承自 Object.) Finalize 允许对象在“垃圾回收”回收之前尝试释放资源并…
ConcurrentBag可以理解为是一个线程安全无序集合,API比我们的list要弱一点,那我们来看看它的实现: public class ConcurrentBag<T> : IProducerConsumerCollection<T>, IReadOnlyCollection<T> { // ThreadLocalList object that contains the data per thread ThreadLocal<ThreadLocalList…
目录 一.前言 二.ConcurrentBag类 三. ConcurrentBag线程安全实现原理 1. ConcurrentBag的私有字段 2. 用于数据存储的TrehadLocalList类 3. ConcurrentBag实现新增元素 4. ConcurrentBag 如何实现迭代器模式 四.总结 笔者水平有限,如果错误欢迎各位批评指正! 一.前言 笔者最近在做一个项目,项目中为了提升吞吐量,使用了消息队列,中间实现了生产消费模式,在生产消费者模式中需要有一个集合,来存储生产者所生产的物…
public static void AddRange<T>(this ConcurrentBag<T> @this, IEnumerable<T> toAdd) { foreach (var element in toAdd) { @this.Add(element); } }…
ConcurrentBag根据操作线程,对不同线程分配不同的队列进行数据操作.这样,每个队列只有一个线程在操作,不会发生并发问题.其内部实现运用了net4.0新加入的ThreadLocal线程本地存储功能.各个队列间通过链表维护. 其内部结构如下: 1.获取线程本地队列: /// <summary> /// 获取当前线程的队列 /// </summary> /// <param name="forceCreate">如果线程没有持有队列,是否新建&l…
https://www.mgenware.com/blog/?p=232 ConcurrentBag<T>对于同一个线程值的添加和删除是非常快的,因为ConcurrentBag内部将数据按线程的标识而独立存储,所以一个线程从自己的数据中移除一个数据是非常快的,当然如果这个线程中没有数据,那么只能从其他线程中移除数据,此时会发生一些性能损耗从而确保线程安全! 比如从线程1中加入两个数据,在线程2中加入一个数据.那么当线程2调用TryTake时,被移除的数据肯定是线程2加入的那个数据: //+ u…
ConcurrentBag并行,不保证顺序,线程安全 public static void ConcurrentBagWithPallel() { ConcurrentBag<int> list = new ConcurrentBag<int>(); Parallel.For(0, 10000, item => { list.Add(item); }); //能够达到10000 Console.WriteLine("ConcurrentBag's count is…
在日常的开发中,经常会遇到多个线程对同一个集合进行读写操作,就难免会出现线程安全问题. 以下代码,如果使用List<T>就会遇到问题:System.InvalidOperationException:“集合已修改:可能无法执行枚举操作.”.原因是timer2在遍历list的过程当中,timer1修改了list,使其大小发生了变化.所以我们应该使用线程安全的集合来处理.不管是读还是写,同一时刻只能做一件事情,要么读,要么写. class Program { private static List…
前言 ConcurrentBag是HikariCP中实现的一个池化资源的并发管理类.它是一个高性能的生产者-消费者队列. ConcurrentBag的并发性能优于LinkedBlockingQueue和LinkedTransferQueue LinkedBlockingQueue 阻塞队列 LinkedTransferQueue 数据传送队列 TransferQueue继承自BlockingQueue接口 TransferQueue的改进: 保留与完成: 保留是指消费者线程在消费时如果发现队列为…
并发集合 1 为什么使用并发集合? 原因主要有以下几点: System.Collections和System.Collections.Generic名称空间中所提供的经典列表.集合和数组都不是线程安全的,若无同步机制,他们不适合于接受并发的指令来添加和删除元素. 在并发代码中使用上述经典集合需要复杂的同步管理,使用起来很不方便. 使用复杂的同步机制会大大降低性能. NET Framework 4所提供的新的集合尽可能地减少需要使用锁的次数.这些新的集合通过使用比较并交换(compare-and-…
1 缓存 Cache 系统中大量的用到缓存设计模式,对系统登入之后不变的数据进行缓存,不从数据库中直接读取.耗费一些内存,相比从SQL Server中再次读取数据要划算得多.缓存的基本设计模式参考下面代码: private static ConcurrentDictionary<string, LookupDialogEntity> _cachedLookupDialogEntities = new ConcurrentDictionary<string, LookupDialogEnt…
NET Core的日志模型主要由三个核心对象构成,它们分别是Logger.LoggerProvider和LoggerFactory.总的来说,LoggerProvider提供一个具体的Logger对象将格式化的日志消息写入相应的目的地,但是我们在编程过程中使用的Logger对象则由LoggerFactory创建,这个Logger利用注册到LoggerFactory的LoggerProvider来提供真正具有日志写入功能的Logger,并委托后者来记录日志. 目录一.Logger    扩展方法L…
文件同步传输工具比较多,传输的方式也比较多,比如:FTP.共享.HTTP等,我这里要讲的就是基于HTTP协议的WEB API实现批量文件由一个服务器同步快速传输到其它多个服务器这样的一个工具(简称:一端到多端的文件同步工具) 一.设计原理: 1.使用的技术:WinForm.WebApi 1.1 WinForm:为程序主界面,作为一端(一个源文件服务器)同步传输到多端(多个目的文件服务器)文件的业务处理中介:程序内部主要通过System.Timers.Timer+HttpClient来实现定时执行…
何为心跳监控系统? 故名思义,就是监控某个或某些个程序的运行状态,就好比医院里面的心跳监视仪一样,能够随时显示病人的心跳情况. 心跳监控的目的是什么? 与医院里面的心跳监视仪目的类似,监控程序运行状态,一旦出现问题(比如:一些自动运行的服务.程序等突然停止运行了),那么心跳监控系统就能“感知到”并及时的显示在监控界面上,同时可以通过微信.短信告之相关的人员,以便他们及时处理程序异常,从而避免一些自动运行的服务.程序等突然停止运行而造成的一系列损失 心跳监控系统实现的思路是怎样的? 核心技术:WC…
C#的集合类命名空间介绍: // 程序集 mscorlib.dll System.dll System.Core.dll // 命名空间 using System.Collections:集合的接口和类 using System.Collections.Generic:泛型集合的接口和类,强类型安全 using System.Collections.Specialized:专用的和强类型的集合 using System.Collections.Concurrent:线程安全的集合 集合基于ICo…
原文: http://www.cnblogs.com/luminji/archive/2011/03/24/1993393.html 要选择正确的集合,我们首先要了解一些数据结构的知识.所谓数据结构,就是相互之间存在一种或多种特定关系的数据元素的集合.结合下图,我们看一下对集合的分类. 集合分类 在上图中,可以看到,集合总体上分为线性集合和非线性集合.线性集合指元素具有唯一的前驱和后驱的数据结构类型.非线性集合是指具有多个前驱或后驱的数据结构类型,如:树.图.在FCL中,非线性集合实现的比较少,…
并发编程,一直是小白变成(●—●)的一个坎.平时也用到过不少并发编程操作,在这里进行一下记录. 多线程并不是唯一 并发:同时做多件事情. 多线程:并发的一种形式,采用多线程来执行程序. 并行处理:把正在执行的大量的任务分割成小块,分配给多个同时运行的线程.并发编程是多线程的一种. 响应式编程:并发的一种形式,一种声明式编程模式,程序在该模式中对事件作出响应. 异步编程:并发的一种形式,采用future模式或回调机制,以避免产生不必要的线程. Net4.5中,添加关键字:async和await,用…
用于记录C#知识要点. 参考:CLR via C#.C#并发编程.MSDN.百度 记录方式:读每本书,先看一遍,然后第二遍的时候,写笔记. CLR:公共语言运行时(Common Language Runtime)是一个可由多种编程语言(VB.F#等)使用的公共语言运行库. 托管模块:编译源码会生成托管模块,他是标准的PE文件.包含:PE32头.CLR头.IL中间语言. 元数据:CLR除了生成IL外,还会生成元数据.元数据总与包含IL代码的文件相关联. 程序集:是一个或多个模块/资源的逻辑性分组.…
发现问题 需求很简单,大致就是要批量往数据库写数据,于是打算用Parallel并行的方式写入,希望能利用计算机多核特性加快程序执行速度.想的很美好,于是快速撸了类似下面的一串代码: using (var db = new SmsEntities()) { Parallel.For(, , (i) => { db.MemberCard.Add(new MemberCard() { CardNo = "NO_" + i.ToString(), Banlance = , CreateT…
// <copyright file="KeyedPriorityQueue.cs" company="Microsoft">Copyright (c) Microsoft Corporation. All rights reserved.</copyright> namespace Microshaoft { using System; using System.Collections.Generic; using System.Colle…
C#集体类型( Collections in C#) 集合是.NET FCL(Framework Class Library)中很重要的一部分,也是我们开发当中最常用到的功能之一,几乎是无处不在.俗话说知其然,知其所以然,平常看到IEnumerable,IEnumerator,ICollection是不是知道他们之间各自的区别?除了List和Dictionary以外,你还用过哪些其它的集合类?废话少说,今天我们就来看一些这些定义集合类的接口以及他们的实现. 集合接口 关联性泛型集合类 非关联性泛…
这个有趣的问题感谢装配脑袋友情提供. 请看如下代码: public class Dummy { public static Dummy Instance; ; ~Dummy() { Instance = this; } } 通过如下代码进行调用(输出日志的地方我稍作调整): Task.Run(() => { var d = new Dummy(); d = null; GC.Collect(); GC.WaitForFullGCComplete(); }).Wait(); var isNull…
本章简言 上一章讲到关于项目工程开发常用的知识点,有了前面俩章的介绍之后.本章正式开始介绍关于C#的基础语法.我们都很清楚C#也是面向对象的计算机语言.而且他跟JAVA的相似度高达80%.所以很多语法点基本上是一样子.学过JAVA的人,现在开始学习C#的话.面临最大的问题是环境的不熟悉.如开发环境.同时有一点希望读者们心里要明白.如果以为看了笔者的博文就可以说学会了,那我只能说你天真了.笔者的博文只能算是一种协助而以.加速你对C#的认识和了解.并且笔者不会更深入的讲解C#,一切以入门上手为主.当…
Parallel并行编程可以让我们使用极致的使用CPU.并行编程与多线程编程不同,多线程编程无论怎样开启线程,也是在同一个CPU上切换时间片.而并行编程则是多CPU核心同时工作.耗时的CPU计算操作选择并行是明智的.通常情况,每个CPU核心代表一个硬件线程,但超线程技术,可以使一个cpu核心具有两个硬件线程.软件线程顾名思义就是我们在程序中所开启的. 下面看一个最基础的并行编程的例子,也足以体现多核心并行运行的好处,当然微软.NET为我们封装后,我们也不必过多关注底层操作,那我们就看一下运行结果…
作为多线程和并行计算不得不考虑的问题就是临界资源的访问问题,解决临界资源的访问通常是加锁或者是使用信号量,这个大家应该很熟悉了. 而集合作为一种重要的临界资源,通用性更广,为了让大家更安全的使用它们,微软为我们带来了强大的并行集合:System.Collections.Concurrent里面的各位仁兄们. 首先,咱们从一个经典的问题谈起. 生产者消费者问题 这个问题是最为经典的多线程应用问题,简单的表述这个问题就是:有一个或多个线程(生产者线程)产生一些数据,同时,还有一个或者多个线程(消费者…
上一章讲了基元线程同步构造,而其它的线程同步构造都是基于这些基元线程同步构造的,并且一般都合并了用户模式和内核模式构造,我们称之为混合线程同步构造. 在没有线程竞争时,混合线程提供了基于用户模式构造所具备的性能优势,而多个线程竞争一个构造时,混合线程通过基元内核模式的构造来提供不“自旋”的优势. 那么接下来就是个简单的混合线程同步构造的例子,可与上一章最后的那些例子相比较: public class SimpleHybridLock : IDisposable { ; private AutoR…
1.BlockCollection集合是一个拥有阻塞功能的集合,它就是完成了经典生产者消费者的算法功能. 它没有实现底层的存储结构,而是使用了IProducerConsumerCollection接口的几个集合作为底层数据接结构,例如:ConcurrentBag.ConcurrentStack.ConcurrentQueue,你可以在构造BlockCollection实例的时候传入这个参数,如果不指定的话,则默认使用ConcurrentQueue作为存储结构.2. 阻塞和退出 //GetCons…
HiKariCP是数据库连接池的一个后起之秀,号称性能最好,可以完美地PK掉其他连接池. 为何要使用HiKariCP?这要先从BoneCP说起: 什么?不是有C3P0/DBCP这些成熟的数据库连接池吗?一直用的好好的,为什么又搞出一个BoneCP来?因为,传说中BoneCP在快速这个特点上做到了极致,官方数据是C3P0等的25倍左右.不相信?其实我也不怎么信.可是,有图有真相啊(图片来自BoneCP官网:http://jolbox.com/benchmarks.html): 而且,网上对于Bon…
using System; using System.Collections.Concurrent; using System.Collections.Generic; using System.Diagnostics; using System.Threading; using System.Threading.Tasks; using System.Linq; using System.Collections; class CQ_EnqueueDequeuePeek { public rea…
一个项目的一个功能点,需要从接口接受返回数据,并对返回的数据进行一些业务处理,处理完成之后,添加到一个List<T>中,然后在View中循环这个List<T>,展示所有的数据.每次从接口中取回的数据量不等,最多会有上百条.虽说上百条也不算多,但是每条数据都要经过一系列的业务处理,感觉这样也挺耗时的,于是考虑使用Parallel.Foreach来进行并行处理. 项目完成之后,对比了一下并行和非并行的情况,发现并行之后并没有提高多少效能,倒是遇到了一些比较怪异的问题. Parallel…