C#生成唯一不重復(fù)訂單號(hào)
在弄電商類網(wǎng)站的時(shí)候,往往是根據(jù)年月日時(shí)分秒的格式生成訂單號(hào)(yyyyMMddHHmmss),為了解決并發(fā)性,就直接在生成訂單號(hào)的區(qū)域塊加上lock。
下面,我們來簡(jiǎn)單測(cè)試一下。
1.新建項(xiàng)目(控制臺(tái)應(yīng)用程序)

2.新建一個(gè)類:OrderIdHelper.cs
/// <summary>
/// 訂單助手
/// </summary>
class OrderIdHelper
{
private static readonly object Locker = new object();
private static string _tempId = "";
/// <summary>
/// 生成訂單編號(hào)
/// </summary>
public static void GenerateId()
{
lock (Locker) //lock 關(guān)鍵字可確保當(dāng)一個(gè)線程位于代碼的臨界區(qū)時(shí),另一個(gè)線程不會(huì)進(jìn)入該臨界區(qū)。
{
var orderId = "Wen" + DateTime.Now.ToString("yyyyMMddHHmmss"); //年月日時(shí)分秒
if (string.Equals(_tempId, orderId))
{
throw new Exception("訂單號(hào)重復(fù)!");
}
_tempId = orderId;
Console.WriteLine(orderId);
}
}
}
3.Program.cs
class Program
{
static void Main(string[] args)
{
//創(chuàng)建包含兩個(gè)線程的數(shù)組
var threads = new Thread[2]
{
new Thread(OrderIdHelper.GenerateId),
new Thread(OrderIdHelper.GenerateId),
};
foreach (var thread in threads)
{
//線程啟動(dòng)
thread.Start();
}
Console.Read();
}
}
4.結(jié)果:=====OrderIdDemo_1.rar 點(diǎn)我下載=====

5.發(fā)現(xiàn)一個(gè)不錯(cuò)的訂單號(hào)生成規(guī)則,稍作改動(dòng): 不重復(fù)訂單號(hào)生成規(guī)則(原網(wǎng)址)
/// <summary>
/// 訂單助手
/// </summary>
public class OrderHelper
{
/// <summary>
/// 防止創(chuàng)建類的實(shí)例
/// </summary>
private OrderHelper() { }
private static readonly object Locker = new object();
private static int _sn = 0;
/// <summary>
/// 生成訂單編號(hào)
/// </summary>
/// <returns></returns>
public static string GenerateId()
{
lock (Locker) //lock 關(guān)鍵字可確保當(dāng)一個(gè)線程位于代碼的臨界區(qū)時(shí),另一個(gè)線程不會(huì)進(jìn)入該臨界區(qū)。
{
if (_sn == int.MaxValue)
{
_sn = 0;
}
else
{
_sn++;
}
Thread.Sleep(100);
return "Wen" + DateTime.Now.ToString("yyyyMMddHHmmss")+ _sn.ToString().PadLeft(10, '0');
}
}
}
6.關(guān)于使用GUID的個(gè)人見解。
①不清楚生成的時(shí)間,不方便管理。
?、诠俜浇忉專篏UID 是一個(gè) 128 位整數(shù)(16 字節(jié)),可用于所有需要唯一標(biāo)識(shí)符的計(jì)算機(jī)和網(wǎng)絡(luò)。 此標(biāo)識(shí)符重復(fù)的可能性非常小。
以上所述就是本文的全部?jī)?nèi)容了,希望大家能夠喜歡。
相關(guān)文章
c#使用htmlagilitypack解析html格式字符串
這篇文章主要介紹了c#使用htmlagilitypack解析html格式字符串的示例,需要的朋友可以參考下2014-03-03
C#使用AForge實(shí)現(xiàn)調(diào)用攝像頭的示例詳解
AForge是一個(gè)專門為開發(fā)者和研究者基于C#框架設(shè)計(jì)的,這個(gè)框架提供了不同的類庫和關(guān)于類庫的資源,本文為大家介紹了C#使用AForge實(shí)現(xiàn)調(diào)用攝像頭的相關(guān)教程,需要的可以了解下2023-11-11
C#聯(lián)合VisionPro實(shí)現(xiàn)TCP/IP通信詳解
TCP/IP(傳輸控制協(xié)議/互聯(lián)網(wǎng)協(xié)議)是一組用于在網(wǎng)絡(luò)上進(jìn)行通信的通信協(xié)議,本文主要為大家詳細(xì)介紹了C#如何聯(lián)合VisionPro實(shí)現(xiàn)TCP/IP通信,希望對(duì)大家有所幫助2024-02-02

