当前位置: 首页 > news >正文

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

在弄电商类网站的时候,往往是根据年月日时分秒的格式生成订单号(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

http://www.lryc.cn/news/373498.html

相关文章:

  • 计算机图形学入门11:图形管线与着色器
  • 正解 x86 Linux 内存管理
  • springboot读取配置时,读取到了系统环境变量
  • 平均召回(Average Recall,AR)概述
  • WWDC 2024 回顾:Apple Intelligence 的发布与解析
  • [Cloud Networking] SPDY 协议
  • Linux-笔记 samba实现映射网络驱动器到Win 10
  • 【技巧】Leetcode 67. 二进制求和【简单】
  • vue项目问题汇总
  • Android 工程副总裁卸任
  • Qt 6.13
  • 发布自己的c#包到nuget
  • 【学习笔记】MySQL(Ⅲ)
  • STM32项目分享:心率血氧手环(可报警)
  • 前端面经总结、学习【2023秋招】
  • Linux DMA-Buf驱动框架
  • MySQL之优化服务器设置(三)
  • 如何实现 Python 源码压缩加密常用解决方案详细教程(更新中)
  • SAP Build 2-PDF数据提取与决策
  • 【回溯】Leetcode 77. 组合【中等】
  • 项目中常量的定义方式
  • BL104钡铼多协议采集网关助力企业智能化转型
  • 【LC刷题】DAY08:151 55 28 459
  • Debian 12.5 一键安装 Oracle 19C 单机
  • ARP协议相关
  • Github 2024-06-14 开源项目日报Top10
  • 记录AE快捷键(持续补充中。。。)
  • 基于springboot实现问卷调查系统项目【项目源码+论文说明】计算机毕业设计
  • React@16.x(29)useRef
  • 无人机的力量——在民用方面的应用