C#中的lock(对象)

时间:2012-02-22 07:24:09

标签: c# asp.net locking

我正在使用C#开发一个带有asp.net的网页。

我有一个至关重要的代码。我希望一次只能有一个用户访问该部分代码。

我使用了以下代码

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行。我无法理解的实际问题是什么?请帮忙

1 个答案:

答案 0 :(得分:3)

假设这是一个单节点应用程序,您锁定的对象必须属于应用程序范围。请记住,每个页面请求都会创建一个新的页面实例,因此如果lock1是该页面的成员,那么多个请求将能够同时执行关键部分。在Global.asax OnApplicationStart>上创建锁定对象。 Application["SalaryPostLock"]

但是,如果您要在群集中运行该应用程序,则需要使用分布式锁定机制。请告知是否是这种情况?