.NET(C#):ConcurrentBag同線程元素的添加和刪除

來源:互聯網
上載者:User

ConcurrentBag<T>對於同一個線程值的添加和刪除是非常快的,因為ConcurrentBag內部將資料按線程的標識而隔離儲存區 (Isolated Storage),所以一個線程從自己的資料中移除一個資料是非常快的,當然如果這個線程中沒有資料,那麼只能從其他線程中移除資料,此時會發生一些效能損耗從而確保安全執行緒!

 

比如從線程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

 

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.