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只有静态时才安全,否则需要自己实现同步和锁定。

 

posted on 2012-08-21 00:03  笑东风  阅读(234)  评论(0)    收藏  举报

导航