https://www.mgenware.com/blog/?p=232

ConcurrentBag<T>对于同一个线程值的添加和删除是非常快的,因为ConcurrentBag内部将数据按线程的标识而独立存储,所以一个线程从自己的数据中移除一个数据是非常快的,当然如果这个线程中没有数据,那么只能从其他线程中移除数据,此时会发生一些性能损耗从而确保线程安全!

比如从线程1中加入两个数据,在线程2中加入一个数据。那么当线程2调用TryTake时,被移除的数据肯定是线程2加入的那个数据:

//+ using System.Threading.Tasks;
//+ using System.Collections.Concurrent; var bag = new ConcurrentBag<string>(); var t1 = Task.Factory.StartNew(() =>
{
bag.Add("线程1: 1");
Thread.Sleep();
bag.Add("线程1: 2"); foreach (var str in bag)
Console.WriteLine(str);
}); var t2 = Task.Factory.StartNew(() =>
{
bag.Add("线程2: 1");
Thread.Sleep(); string str;
bag.TryTake(out str);
Console.WriteLine("线程2取出:" + str);
}); Task.WaitAll(t1, t2); 输出: 线程1:
线程1:
线程2:
线程2取出:线程2: 如果在线程2(代码中的t2 Task)去掉往ConcurrentBag中添加数据的代码,那么ConcurrentBag将会从线程1的数据中删除一项元素。示例输出: 线程1:
线程1:
线程2取出:线程1:

ConcurrentBag<T>对于同一个线程值的添加和删除是非常快的,因为ConcurrentBag内部将数据按线程的标识而独立存储,所以一个线程从自己的数据中移除一个数据是非常快的,当然如果这个线程中没有数据,那么只能从其他线程中移除数据,此时会发生一些性能损耗从而确保线程安全!

比如从线程1中加入两个数据,在线程2中加入一个数据。那么当线程2调用TryTake时,被移除的数据肯定是线程2加入的那个数据:

//+ using System.Threading.Tasks;
//+ using System.Collections.Concurrent; var bag =newConcurrentBag<string>(); var t1 =Task.Factory.StartNew(() =>
{
bag.Add("线程1: 1");
Thread.Sleep(1000);
bag.Add("线程1: 2"); foreach (var str in bag)
Console.WriteLine(str);
}); var t2 =Task.Factory.StartNew(() =>
{
bag.Add("线程2: 1");
Thread.Sleep(2000); string str;
bag.TryTake(out str);
Console.WriteLine("线程2取出:"+ str);
}); Task.WaitAll(t1, t2);

输出:

线程1: 2
线程1: 1
线程2: 1
线程2取出:线程2: 1

如果在线程2(代码中的t2 Task)去掉往ConcurrentBag中添加数据的代码,那么ConcurrentBag将会从线程1的数据中删除一项元素。示例输出:

线程1: 2
线程1: 1
线程2取出:线程1: 1

ConcurrentBag同线程元素的添加和删除的更多相关文章

  1. JS数组方法汇总 array数组元素的添加和删除

    js数组元素的添加和删除一直比较迷惑,今天终于找到详细说明的资料了,先给个我测试的代码^-^ var arr = new Array(); arr[0] = "aaa"; arr[ ...

  2. javascript数组元素的添加、删除与插入以及参数数组的使用

    1.数组元素的添加 push方法在数组的尾部添加元素: var colorArray=new Array(); colorArray.push('red','black','yellow'); //这 ...

  3. JS 数组方法 array数组声明 元素的添加和删除 等

    声明数组 var arr1 = [1,2,3,4,5]; var arr2 = new Array(100); //声明长度为100的arr2数组. arr2=[]; arr2.length = 10 ...

  4. js中数组元素的添加和删除

    js中数组元素常用添加方法是直接添加.push方法以及unshift方法 删除方法则是delete.pop.shift 集修改方法为一身的则是splice 1.添加: (1)直接添加通常都是这样 va ...

  5. js数组元素的添加和删除

    简单测试例子: var arr = new Array(); arr[0] = "aaa"; arr[1] = "bbb"; arr[2] = "cc ...

  6. angular.element 动态添加和删除元素

    addClass()-为每个匹配的元素添加指定的样式类名after()-在匹配元素集合中的每个元素后面插入参数所指定的内容,作为其兄弟节点append()-在每个匹配元素里面的末尾处插入参数内容att ...

  7. Winform中对自定义xml配置文件进行Xml节点的添加与删除

    场景 Winform中自定义xml配置文件后对节点进行读取与写入: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/10053213 ...

  8. js数值的添加与删除

    js中数组元素的添加和删除 js中数组元素常用添加方法是直接添加.push方法以及unshift方法 删除方法则是delete.pop.shift 集修改方法为一身的则是splice 1.添加: (1 ...

  9. 添加和删除节点(HTML 元素)。

    JavaScript HTML DOM 元素(节点)   添加和删除节点(HTML 元素). 创建新的 HTML 元素 如需向 HTML DOM 添加新元素,您必须首先创建该元素(元素节点),然后向一 ...

随机推荐

  1. idea小问题解决方法系列

    1)有些java文件上显示“红色小j”,如图所示 ,意思是“不可编译”,原因是Module未导入或者没有标记Module下"Sources"一栏src文件夹为Sources.(ht ...

  2. 二十四种设计模式:模板方法模式(Template Method Pattern)

    模板方法模式(Template Method Pattern) 介绍定义一个操作中的算法的骨架,而将一些步骤延迟到子类中.Template Method使得子类可以不改变一个算法的结构即可重定义该算法 ...

  3. [转]SSIS: Execute Package via Stored Procedure

    本文转自:http://sqlblog.de/blog/2009/09/ssis-execute-package-via-stored-procedure/ There are two options ...

  4. JS夯实基础:Javascript 变态题解析 (下)

    function sidEffecting(ary) { ary[] = ary[]; } function bar(a,b,c) { c = sidEffecting(arguments); ret ...

  5. hdu1227 Fast Food

    题目链接:http://acm.hdu.edu.cn/showproblem.php? pid=1227 #include <iostream> #include <cstdio&g ...

  6. Linux C高级编程——文件操作之系统调用

    Linux C高级编程文件操作之系统调用 宗旨:技术的学习是有限的,分享的精神是无限的.           库函数是一些完毕特定功能的函数.一般由某个标准组织制作公布,并形成一定的标准.使用库函数编 ...

  7. centos6.8服务器配置之编译安装PHP、配置nginx

    php version 5.6.31.nginx version: nginx/1.10.2 1.下载: wget http://cn2.php.net/distributions/php-5.6.3 ...

  8. 7个高级技巧帮助你释放大量Mac OS X硬盘空间

    7个高级技巧帮助你释放大量Mac OS X硬盘空间 https://blog.csdn.net/hu434587115/article/details/72874811/

  9. Moving Tables-贪心

    id=19566" target="_blank" style="color:blue; text-decoration:none">Movin ...

  10. SVN:This client is too old to work with working copy…解决方法

    昨天升级了一下苹果系统到10.10,扁平化确实不错,高兴之余多少有些不快.我的svn出现故障,总是提示我  SVN:This client is too old to work with workin ...