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

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

cs 复制代码
        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;
            }
        }
cs 复制代码
 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
相关推荐
外收内放3 分钟前
Python基础语法练习题(57-58)
开发语言·python
时间的拾荒人9 分钟前
Qt 界面美化实战:QSS 样式表
开发语言·qt·面试
杨运交38 分钟前
[076][核心模块]构建优雅的Java异常处理框架:从错误码到全局异常处理
java·开发语言
可乐鸡翅yeah_1 小时前
video.js 集成 hls.js 开发 M3U8 播放器,新手高频踩坑
开发语言·前端·javascript·后端·ecmascript·m3u8·音视频在线播放
小鹿的周先生1 小时前
第11章-Structured-Output
开发语言·人工智能·python
泡海椒1 小时前
JQuick-Excel 实战:FORMAT 管理日期与数字的 Excel 显示
开发语言·python·excel
qq_401700412 小时前
Qt 串口/网口通信:Hex 与 ASCII 编码转换深度指南
开发语言·数据库·qt
佳児素花痴╮2 小时前
线程知识点
java·开发语言·jvm
学掌门2 小时前
老司机带你十分钟入门Python!
开发语言·python
zhangzeyuaaa3 小时前
深入 Ruby:return 退出规则完全指南
开发语言·ruby