成都眉山网站建设神马推广
在弄电商类网站的时候,往往是根据年月日时分秒的格式生成订单号(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位长度的在左边补足对应个数的0Console .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));}}#regionprivate 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