Collection学习1
User
public class User { public int UserId { get; set; } public string UserName { get; set; } }
Use CurentBag
public class UserManager { private static object lockFlag = new object(); private static int maxUserId = 0; public static int MaxUserId { get { return maxUserId; } } public static int GetNextUserId() { lock (lockFlag) { maxUserId++; return maxUserId; } } public static void AddUser() { int userId = GetNextUserId(); if (userId % 1000 == 0) { Console.WriteLine("UserId: " + userId.ToString() + " DT:" + DateTime.Now.ToString("HH:mm:ss.fff")); } User user = new User() { UserId = userId, UserName = "User" + userId.ToString() }; } public static List<User> GetUsers(int maxUserId) { List<User> result = new List<User>(); for(int i=0;i<Users.Count;i++) { User user = Users.ElementAt(i); if (user.UserId > maxUserId) { result.Add(user); } } return result; } public static ConcurrentBag<User> Users = new ConcurrentBag<User>(); }
Test
class Program { static void Main(string[] args) { int thCount = 500; Console.WriteLine("UserId: 0 " + " DT:" + DateTime.Now.ToString("HH:mm:ss.fff")); while (thCount > 0) { Thread th = new Thread(new ThreadStart(Test)); th.Name = "TH" + thCount.ToString(); th.Start(); thCount--; } } public static void Test() { int maxId = 0; int count = 0; while (true) { if (count % 2 == 0) { DateTime dt1 = DateTime.Now; UserManager.AddUser(); DateTime dt2 = DateTime.Now; int usedMS = dt2.Subtract(dt1).Milliseconds; //Console.WriteLine("AddComment:" + usedMS.ToString() + "ms " + DateTime.Now.ToString("hh:mm:ms")); } else { DateTime dt1 = DateTime.Now; List<User> result = UserManager.GetUsers(maxId); DateTime dt2 = DateTime.Now; int usedMS = dt2.Subtract(dt1).Milliseconds; //Console.WriteLine("GeComments:" + result.Count.ToString()+" Used " + usedMS.ToString() + "ms "+DateTime.Now.ToString("hh:mm:ms")); if (result.Count > 0) { maxId = result.Select(p => p.UserId).Max(); } } count++; } } }

Use List
public class UserManager { private static object lockFlag = new object(); private static int maxUserId = 0; public static int MaxUserId { get { return maxUserId; } } public static int GetNextUserId() { lock (lockFlag) { maxUserId++; return maxUserId; } } public static void AddUser() { int userId = GetNextUserId(); if (userId % 1000000 == 0) { Console.WriteLine("UserId: " + userId.ToString() + " DT:" + DateTime.Now.ToString("HH:mm:ss.fff")); } User user = new User() { UserId = userId, UserName = "User" + userId.ToString() }; } public static List<User> GetUsers(int maxUserId) { List<User> result = new List<User>(); for(int i=0;i<Users.Count;i++) { User user = Users[i]; if (user.UserId > maxUserId) { result.Add(user); } } return result; } public static List<User> Users = new List<User>(); }
List Result:

静态的List是类型安全的,但不可以使用Foreach对其进行遍历。每次foreach操作,都会检查遍历对象的版本,若版本发生变化,则会抛出异常。
从性能来看,List比ConcurrentBag要好,
从实现来看,List只有静态时才安全,否则需要自己实现同步和锁定。
浙公网安备 33010602011771号