C#使用线程安全的变量

// 使用线程安全的变量
            //
            // 字典 - ConcurrentDictionary
            // 调用 ConcurrentDictionary 本身的方法和属性可以保证都是线程安全的。但是由于 ConcurrentDictionary 实现了一些接口(例如 ICollection、IEnumerable 和 IDictionary 等),使用这些接口的成员(或者这些接口的扩展方法)不能保证其线程安全性
            // dicExecuted.ToList(); //调用 System.Linq.Enumerable.ToList,抛出 System.ArgumentException 异常
            // dicExecuted.ToArray(); //调用 System.Linq.Enumerable.ToArray,抛出 System.ArgumentException 异常 
            ConcurrentDictionary<string, string> dicExecuted = new ConcurrentDictionary<string, string>();
            var no1 = "1"; var name1 = "张三"; 
            ExtensionMethods.AddOrUpdate(dicExecuted, no1, name1);  //dicExecuted.AddOrUpdate(no1, name1, (oldkey, oldvalue) => name1);// 添加 
            foreach (var item in dicExecuted)// 遍历
            {
                Console.WriteLine($"no:{item.Key},name:{item.Value}");
            }
            var exist = dicExecuted.TryGetValue(no1, out var name2);// 查询
            if (exist)
            {
                name1 = "李四"; 
                ExtensionMethods.AddOrUpdate(dicExecuted, no1, name1);//dicExecuted.AddOrUpdate(no1, name1, (oldkey, oldvalue) => name1);// 更新
                dicExecuted.TryRemove(no1, out _);// 删除
            }

            // 队列 - ConcurrentQueue(先入先出)
            ConcurrentQueue<int> queue = new ConcurrentQueue<int>();
            if (queue.IsEmpty)
            {
                queue.Enqueue(1);// 入列 
                queue.Enqueue(2);
                var status = queue.TryDequeue(out var data);// 出列,1
                var count = queue.Count;
            }

            // 堆栈 - ConcurrentQueue(后入先出)
            ConcurrentStack<int> stack = new ConcurrentStack<int>();
            if (stack.IsEmpty)
            {
                stack.Push(1);// 入栈 
                stack.Push(2);
                var status = stack.TryPop(out var data);// 出栈,2
                var count = stack.Count;
            }

            // 列表 - ConcurrentBag
            ConcurrentBag<int> list = new ConcurrentBag<int>();// 代替list
            if (list.IsEmpty)
            { 
                list.Add(1);
                list.Add(2);
                list.Add(3);
                //var temp = list.OrderBy(x => x);
                foreach (var item in list)
                {
                    Console.WriteLine($"item:{item}");
                }
                var it = list.First(p => p == 2);// 查找
                list.TryTake(out it);  // 移除,不能移除指定项
                list.Clear();// 清空 
                var count = list.Count;
            }

 

posted @ 2023-09-07 10:58  CHHC  阅读(163)  评论(0编辑  收藏  举报