2012-02-22 5 views
0

Я разрабатываю веб-страницу с помощью asp.net с использованием C#.lock (object) in 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

какой замок1? Обычно это: private static readonly object lock1 = new object(); – row1

+3

Я думаю, что это не имеет никакого отношения к заявлению о блокировке? Вероятно, ваш код выполняется дважды по стоп-лоту. – Jehof

ответ

3

Предполагая, что это приложение с одним узлом, объект, на котором вы блокируете, должен обладать областью приложения. Помните, что каждый запрос страницы создает новый экземпляр страницы, поэтому, если lock1 является членом этой страницы, тогда несколько запросов смогут одновременно выполнять критический раздел. Создайте объект блокировки на сервере Global.asax OnApplicationStart>Application["SalaryPostLock"].

Если, однако, вы запустите приложение в кластере, вам понадобится распределенный механизм блокировки. Пожалуйста, сообщите, если это так?