少有人走的路

勇哥的工业自动化技术网站

C# .net Framework下的 ImmutableList 不变对象集合类的使用方法

勇哥注:

不可变对象集合类由于其特性,天生就是线程安全的,多线程同时读写都没得问题。

它一共有下面这些:

  • ImmutableArray<T>

  • ImmutableStack<T>

  • ImmutableQueue<T>

  • ImmutableList<T>

  • ImmutableHashSet<T>

  • ImmutableSortedSet<T>

  • ImmutableDictionary<K, V>

  • ImmutableSortedDictionary<K, V>

但是这种集合在频繁修改的时候开销就比较大。


下面勇哥写一个示例程序:

image.png

using System;
using System.Collections.Generic;
using System.Collections.Immutable;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {

        ImmutableList<int> list1= ImmutableList.Create<int>();
     
        public Form1()
        {
            InitializeComponent();
           
        }

        private void button1_Click(object sender, EventArgs e)
        {
            
            Task.Factory.StartNew(() =>
            {
                while (true)
                {
                    Random ran = new Random();
                    var list2 = list1.ToBuilder();
                    list2.Add(ran.Next(0,1000));
                    list1 = list2.ToImmutable();
                   
                    Thread.Sleep(1300);
                    
                }
            });
          
            
        }

        private void button2_Click(object sender, EventArgs e)
        {
         
            Task.Factory.StartNew(() =>
            {
                while (true)
                {
                    Random ran = new Random();
                    var list2 = list1.ToBuilder();
                    list2.Add(ran.Next(0,1000));
                    list1 = list2.ToImmutable();
                    Thread.Sleep(1800);

                }
            });

        }

        private void button3_Click(object sender, EventArgs e)
        {
            timer1.Enabled = true;
            timer1.Start();


        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            var sb1 = new StringBuilder();
            for(int i=0;i<list1.Count;i++)
            {
                sb1.Append(list1[i] + ",");
            }
            RtbMsg.Text = sb1.ToString();
        }

        private void button4_Click(object sender, EventArgs e)
        {
            list1=list1.RemoveAt(0);
        }
    }
}


另一有篇介绍不可变对象集合见下面文章:

https://www.skcircle.com/?id=1996


另外,此集合不是.net Framework自带的,你得去Nuget去下载,下载关键字如下:

image.png



--------------------- 

作者:hackpig

来源:www.skcircle.com

版权声明:本文为博主原创文章,转载请附上博文链接!


发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

«    2025年12月    »
1234567
891011121314
15161718192021
22232425262728
293031
控制面板
您好,欢迎到访网站!
  查看权限
网站分类
搜索
最新留言
文章归档
网站收藏
友情链接

Powered By Z-BlogPHP 1.7.3

Copyright www.skcircle.com Rights Reserved.

鄂ICP备18008319号


站长QQ:496103864 微信:abc496103864