2012-02-22 68 views
0

我正在用asp.net開發一個使用C#的網頁。C中的鎖(對象)#

我有一個關鍵的代碼。我只想讓一個用戶一次訪問這段代碼。

我用下面的代碼

string doc_number = ""; 
try { 
    lock (lock1) { 

     doc_number = PostSalaryToSAP(); 

     // doc_number = ""; 
     if (doc_number.Length > 6) { 
      this.Result.Text = "Posting Successful For Employee id '" + cbEmpID.SelectedItem.Text.ToString() + "' With Doc_number : " + doc_number; 
      this.Result.ForeColor = System.Drawing.Color.Green; 
      this.btnPost.Enabled = false; 
      this.btnDelete.Enabled = false; 
     } else { 
      this.Result.Text = "Posting Failed "; 
      this.Result.ForeColor = System.Drawing.Color.Green; 
     } 
    } 
} catch (Exception ex1) { 
    Result.Text = "Posting Unsuccessful "; 
    Result.ForeColor = System.Drawing.Color.Green; 
} 

但與此代碼這一結果沒有得到正確生成。通常這條線爲db表添加單條記錄:

doc_number = PostSalaryToSAP(); 

但是使用這段代碼它增加了2行。什麼是我無法理解的實際問題?請幫助

+3

什麼是lock1?它通常是:private static readonly object lock1 = new object(); – row1 2012-02-22 07:29:35

+3

我認爲這與鎖定聲明無關?你的代碼可能會在callstack上執行兩次。 – Jehof 2012-02-22 07:29:57

回答

3

假設這是一個單節點應用程序,您鎖定的對象必須是應用程序範圍。請記住,每個頁面請求都會創建一個新的頁面實例,因此如果lock1是該頁面的成員,那麼多個請求將能夠同時執行關鍵部分。在Global.asax OnApplicationStart>Application["SalaryPostLock"]上創建鎖定對象。

但是,如果您將在集羣中運行應用程序,則需要分佈式鎖定機制。請告知這是否是這種情況?