首页 > 编程 > C# > 正文

C#生成唯一不重复订单号

2019-10-29 21:41:34
字体:
来源:转载
供稿:网友
本文给大家介绍的是使用C#生成唯一不重复订单号的方法,主要用到了lock锁,有需要的小伙伴可以参考下。
 

在弄电商类网站的时候,往往是根据年月日时分秒的格式生成订单号(yyyyMMddHHmmss),为了解决并发性,就直接在生成订单号的区域块加上lock。

  下面,我们来简单测试一下。

1.新建项目(控制台应用程序)

C#生成唯一不重复订单号

2.新建一个类:OrderIdHelper.cs
 

  1. /// <summary> 
  2. /// 订单助手 
  3. /// </summary> 
  4. class OrderIdHelper 
  5.   private static readonly object Locker = new object(); 
  6.   private static string _tempId = ""
  7.  
  8.   /// <summary> 
  9.   /// 生成订单编号 
  10.   /// </summary> 
  11.   public static void GenerateId() 
  12.   { 
  13.     lock (Locker)  //lock 关键字可确保当一个线程位于代码的临界区时,另一个线程不会进入该临界区。 
  14.     { 
  15.       var orderId = "Wen" + DateTime.Now.ToString("yyyyMMddHHmmss"); //年月日时分秒 
  16.  
  17.       if (string.Equals(_tempId, orderId)) 
  18.       { 
  19.         throw new Exception("订单号重复!"); 
  20.       } 
  21.  
  22.       _tempId = orderId; 
  23.  
  24.       Console.WriteLine(orderId); 
  25.     } 
  26.   } 
?

3.Program.cs
 

  1. class Program 
  2.   static void Main(string[] args) 
  3.   { 
  4.     //创建包含两个线程的数组 
  5.     var threads = new Thread[2] 
  6.     { 
  7.       new Thread(OrderIdHelper.GenerateId), 
  8.       new Thread(OrderIdHelper.GenerateId), 
  9.     }; 
  10.  
  11.     foreach (var thread in threads) 
  12.     { 
  13.       //线程启动 
  14.       thread.Start(); 
  15.     } 
  16.  
  17.     Console.Read(); 
  18.   } 
?

4.结果:=====OrderIdDemo_1.rar 点我下载=====

C#生成唯一不重复订单号

5.发现一个不错的订单号生成规则,稍作改动: 不重复订单号生成规则(原网址)
 

  1. /// <summary> 
  2. /// 订单助手 
  3. /// </summary> 
  4. public class OrderHelper 
  5.   /// <summary> 
  6.   /// 防止创建类的实例 
  7.   /// </summary> 
  8.   private OrderHelper() { } 
  9.  
  10.   private static readonly object Locker = new object(); 
  11.   private static int _sn = 0; 
  12.  
  13.   /// <summary> 
  14.   /// 生成订单编号 
  15.   /// </summary> 
  16.   /// <returns></returns> 
  17.   public static string GenerateId() 
  18.   { 
  19.     lock (Locker)  //lock 关键字可确保当一个线程位于代码的临界区时,另一个线程不会进入该临界区。 
  20.     { 
  21.       if (_sn == int.MaxValue) 
  22.       { 
  23.         _sn = 0; 
  24.       } 
  25.       else 
  26.       { 
  27.         _sn++; 
  28.       } 
  29.        
  30.       Thread.Sleep(100); 
  31.  
  32.       return "Wen" + DateTime.Now.ToString("yyyyMMddHHmmss")+ _sn.ToString().PadLeft(10, '0'); 
  33.     } 
  34.   }  
?

 6.关于使用GUID的个人见解。

 ①不清楚生成的时间,不方便管理。

  ②官方解释:GUID 是一个 128 位整数(16 字节),可用于所有需要唯一标识符的计算机和网络。 此标识符重复的可能性非常小。

以上所述就是本文的全部内容了,希望大家能够喜欢。


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表