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; }
qq:505645074