ConcurrentBag同线程元素的添加和删除

发布时间:2017-7-9 7:08:14编辑:www.fx114.net 分享查询网我要评论
本篇文章主要介绍了"ConcurrentBag同线程元素的添加和删除 ",主要涉及到ConcurrentBag同线程元素的添加和删除 方面的内容,对于ConcurrentBag同线程元素的添加和删除 感兴趣的同学可以参考一下。

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(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<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


上一篇:饱受诟病的白板面试,为什么沿用至今?
下一篇:微信小程序通过api接口将json数据展现到小程序示例

相关文章

相关评论

本站评论功能暂时取消,后续此功能例行通知。

一、不得利用本站危害国家安全、泄露国家秘密,不得侵犯国家社会集体的和公民的合法权益,不得利用本站制作、复制和传播不法有害信息!

二、互相尊重,对自己的言论和行为负责。

好贷网好贷款