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
相关推荐
树叶@13 分钟前
Python数据分析7
开发语言·python
wydaicls16 分钟前
十一.C++ 类 -- 面向对象思想
开发语言·c++
Biomamba生信基地1 小时前
R语言基础| 下载、安装
开发语言·r语言·生信·医药
姜君竹1 小时前
QT的工程文件.pro文件
开发语言·c++·qt·系统架构
奇树谦1 小时前
使用VTK还是OpenGL集成到qt程序里哪个好?
开发语言·qt
VBA63371 小时前
VBA之Word应用第三章第十节:文档Document对象的方法(三)
开发语言
老胖闲聊1 小时前
Python Rio 【图像处理】库简介
开发语言·图像处理·python
码界奇点2 小时前
Python Flask文件处理与异常处理实战指南
开发语言·python·自然语言处理·flask·python3.11
贩卖纯净水.2 小时前
浏览器兼容-polyfill-本地服务-优化
开发语言·前端·javascript
k要开心2 小时前
C++概念以及基础框架语法
开发语言·c++