C#:lock锁与订单号(或交易号)的生成

在弄电商类网站的时候,往往是根据年月日时分秒的格式生成订单号(yyyyMMddHHmmss),为了解决并发性,就直接在生成订单号的区域块加上lock。

        static void Main(string[] args)
        {

            for(int i=0; i<100; i++)
            {
                //GetRandomTime();
                GenerateId();
            }
        }




        private static readonly object Locker = new object();
        private static int _sn = 0;

        /// <summary>
        /// 生成编码
        /// </summary>
        /// <returns></returns>
        public static string GenerateId()
        {
            lock (Locker)   //lock 关键字可确保当一个线程位于代码的临界区时,另一个线程不会进入该临界区。
            {
                if (_sn == int.MaxValue)
                {
                    _sn = 0;
                }
                else
                {
                    _sn++;
                }

                Thread.Sleep(100);
                //string DateStr = DateTime.Now.ToString("yyyyMMddHHmmssMM");//日期
                string Code = "Wen" + DateTime.Now.ToString("yyyyMMddHHmmssMM") + _sn.ToString().PadLeft(10, '0');//单据号的长度为10位长度,不够10位长度的在左边补足对应个数的0
                Console .WriteLine(Code);
                return Code;
            }
        }

 static void Main(string[] args)
 {

     for(int i=0; i<100; i++)
     {
         //GetRandomTime();
         //GenerateId("wen");

       Console .WriteLine (  Gener("", "uid",  4,  1));
     }
 }





 #region


 private static object obj = new object();
 private static int GuidInt { get { return Guid.NewGuid().GetHashCode(); } }
 private static string GuidIntStr { get { return Math.Abs(GuidInt).ToString(); } }

 /// <summary>
 /// 生成
 /// </summary>
 /// <param name="mark">前缀</param>
 /// <param name="timeType">时间精确类型  1 日,2 时,3 分,4 秒,5毫秒(默认) </param>
 /// <param name="id">id 小于或等于0则随机生成id</param>
 /// <returns></returns>
 public static string Gener(string orderNo, string mark, int timeType = 5, int id = 1)
 {
     lock (obj)
     {
         var number = mark;
         var ticks = (DateTime.Now.Ticks - GuidInt).ToString();
         int fillCount = 0;//填充位数

         number += GetTimeStr(timeType, out fillCount);
         if (!string.IsNullOrEmpty(orderNo))
         {
             var numberNo = orderNo.Substring(25);
             if (numberNo.Length > 3)
             {
                 number += $"{ticks.Substring(ticks.Length - (fillCount + 3))}{(long.Parse(numberNo) + 1)}";
             }
             else
             {
                 int count = numberNo.Count(x => x == '0');
                 var str = (long.Parse(numberNo) + 1).ToString();
                 str = str.PadLeft(count == 1 ? count + 2 : count + 1, '0');

                 number += $"{ticks.Substring(ticks.Length - (fillCount + 3))}{str}";
             }
         }
         else if (id > 0)
         {
             //number += ticks.Substring(ticks.Length - (fillCount + 3)) + id.ToString().PadLeft(10, '0');
             number += $"{ticks.Substring(ticks.Length - (fillCount + 3))}{id.ToString().PadLeft(3, '0')}";
         }
         else
         {
             number += ticks.Substring(ticks.Length - (fillCount + 3)) + GuidIntStr.PadLeft(3, '0');
         }

         return number;
     }
 }

 /// <summary>
 /// 获取时间字符串
 /// </summary>
 /// <param name="timeType">时间精确类型  1 日,2 时,3 分,4 秒(默认)</param>
 /// <param name="fillCount">填充位数</param>
 /// <returns></returns>
 private static string GetTimeStr(int timeType, out int fillCount)
 {
     var time = DateTime.Now;
     if (timeType == 1)
     {
         fillCount = 6;
         return time.ToString("yyyyMMdd");
     }
     else if (timeType == 2)
     {
         fillCount = 4;
         return time.ToString("yyyyMMddHH");
     }
     else if (timeType == 3)
     {
         fillCount = 2;
         return time.ToString("yyyyMMddHHmm");
     }
     else if (timeType == 4)
     {
         fillCount = 0;
         return time.ToString("yyyyMMddHHmmss");
     }
     else
     {
         fillCount = 0;
         return time.ToString("yyyyMMddHHmmssffff");
     }
 }






 #endregion

相关推荐

  1. php 中生成订单

    2024-06-15 18:00:04       64 阅读
  2. python订单生成方式

    2024-06-15 18:00:04       42 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-06-15 18:00:04       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-06-15 18:00:04       100 阅读
  3. 在Django里面运行非项目文件

    2024-06-15 18:00:04       82 阅读
  4. Python语言-面向对象

    2024-06-15 18:00:04       91 阅读

热门阅读

  1. 2024.6.14刷题记录-KMP记录

    2024-06-15 18:00:04       37 阅读
  2. Qt day2

    Qt day2

    2024-06-15 18:00:04      30 阅读
  3. VSCode使用git出现的问题记录--git回退

    2024-06-15 18:00:04       27 阅读
  4. CocosCreator3.x相机实践

    2024-06-15 18:00:04       24 阅读
  5. 在 Python 中创建具有当前日期和时间的文件名

    2024-06-15 18:00:04       29 阅读
  6. Redis(基础篇)

    2024-06-15 18:00:04       23 阅读