我有一個助手類,它會從我的 web 應用程式的多個同時使用的用戶中呼叫很多。此類中的一個函式嘗試創建一個在資料庫中保證唯一的字串,即使 50 個不同的用戶/執行緒同時呼叫該函式。以下是我的代碼的基本部分:
private Object threadLock = new Object();
private string generateConfigIDThreadLock(Settings settings, string salesOrderNumber, string configModifiedOn) {
lock(threadLock) {
return generateConfigID(settings, salesOrderNumber, configModifiedOn);
}
}
private string generateConfigID(Settings settings, string salesOrderNumber, string configModifiedOn) {
string soTruncated = string.Empty;
if (salesOrderNumber.Length >= 5) {
soTruncated = salesOrderNumber.Substring(salesOrderNumber.Length - 5, 5);
} else {
soTruncated = salesOrderNumber;
}
int configModifiedOnSummed = Utilities.SumNumbers(configModifiedOn);
string newConfigID = $ "{soTruncated}-{DateTime.Now.Hour}{DateTime.Now.Minute}{DateTime.Now.Second}{DateTime.Now.Millisecond}-{configModifiedOnSummed}";
System.Threading.Thread.Sleep(50); // simulate the time for an API roundtrip
return newConfigID;
}
在我的測驗工具中,我通過這樣做來模擬大量的同時使用:
static void Main(string[] args) {
int n = 50;
for (int i = 0; i < n; i ) {
Thread t = new Thread(TestOnMultipleThreads);
t.Start();
}
Console.ReadLine();
}
private static void TestOnMultipleThreads() {
var functions = new Functions();
string configID = functions.GetConfigID(string.Empty, "S-00018437", "2021-12-11 22:11:22");
if (configIDs.Contains(configID)) {
Console.WriteLine("PROLBEM! ConfigId was generated twice: " configID);
} else {
Console.WriteLine("Unique configID: " configID);
configIDs.Add(configID);
}
}
我不能使用 guid 來實作唯一性;我需要將字串保持在 25 個字符以下,并在 Config ID 中使用 SO # 和時間戳的一部分。注意硬編碼的銷售訂單號和日期/時間戳TestOnMultipleThreads();這是一個真實的場景。許多呼叫者可能具有相同的 SO # 和相同的日期時間。我需要使用 Sales Order # 的元素和當前時間戳來生成唯一性。如您所見,milsecs是我唯一字串的一部分,因此即使 2 個呼叫相隔 1 毫秒,生成的字串 ID 也將是唯一的。但在我的模擬中,我每次都會得到重復。這似乎意味著我的執行緒鎖不起作用;如果是這樣,并且由于我Thread.Sleep(50)也在使用,則不可能在同一 1 毫秒內生成配置 ID。
我究竟做錯了什么?為什么我得到重復?為什么執行緒阻塞沒有按預期發生?
uj5u.com熱心網友回復:
在您的代碼中,看起來每個執行緒都在處理一個單獨的 Functions 實體,因此它們每個都鎖定在自己的(單獨的)鎖定物件上。
快速解決方法是將該物件設為靜態,以便在所有 Functions 實體之間共享它,或者讓所有執行緒共享相同的 Functions 實體。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/379647.html
