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
相关推荐
zhangfeng11332 小时前
openclaw skills 小龙虾技能 通讯仿真 matlab skill Simulink Agentic Toolkit,通过kimi找到,mcp通讯
开发语言·matlab·openclaw·通讯仿真
chao1898448 小时前
基于 SPEA2 的多目标优化算法 MATLAB 实现
开发语言·算法·matlab
赏金术士8 小时前
Kotlin 习题集 · 高级篇
android·开发语言·kotlin
楼兰公子9 小时前
buildroot 在编译rust时裁剪平台类型数量的方法
开发语言·后端·rust
吴声子夜歌10 小时前
Go——并发编程
开发语言·后端·golang
ooseabiscuit10 小时前
Laravel4.x:现代PHP框架的奠基之作
java·开发语言·php
c1s2d3n4cs11 小时前
Qt模仿nlohmann::json进行序列化和反序列化
开发语言·qt·json
没什么本事11 小时前
关于C# panel 添加lable问题 -- 明确X和Y 位置错误
android·java·c#
AiTop10011 小时前
Claude Code 推出 Agent View:命令行编程正式进入“多线程并发“时代
开发语言·人工智能·ai·aigc
jf加菲猫11 小时前
第21章 Qt WebEngine
开发语言·c++·qt·ui