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
相关推荐
星星法术嗲人4 分钟前
【Java】—— 集合框架:Collections工具类的使用
java·开发语言
黑不溜秋的18 分钟前
C++ 语言特性29 - 协程介绍
开发语言·c++
一丝晨光23 分钟前
C++、Ruby和JavaScript
java·开发语言·javascript·c++·python·c·ruby
天上掉下来个程小白25 分钟前
Stream流的中间方法
java·开发语言·windows
xujinwei_gingko36 分钟前
JAVA基础面试题汇总(持续更新)
java·开发语言
sp_wxf1 小时前
Lambda表达式
开发语言·python
Fairy_sevenseven1 小时前
【二十八】【QT开发应用】模拟WPS Tab
开发语言·qt·wps
蜡笔小新星1 小时前
Python Kivy库学习路线
开发语言·网络·经验分享·python·学习
凯子坚持 c1 小时前
C语言复习概要(三)
c语言·开发语言
无限大.1 小时前
c语言200例 067
java·c语言·开发语言