monitor.enter(锁定)问题

时间:2012-01-16 08:28:24

标签: c# asp.net multithreading

我正在使用C#在ASP.NET中开发一个网页。

许多用户可以同时访问该页面。

点击按钮我正在调用一个具有关键部分的功能。

我已将该代码放入

try
{
    moniter.enter(lock)         
    salbapi.Sislemcu_Epayroll_Salffs_Bapi(Saljv_str, "N", out messdata, ref Saljv_table);
}
catch(Exception e)
{
}
finally
{
    moniter.exit(lock).
}

现在假设2个用户是否同时访问该功能。

处理的结果消息被交换或不交换(向用户显示错误的消息)。

不应该发生。

3 个答案:

答案 0 :(得分:0)

您是否在询问这是否是线程安全的?如果所有线程都具有lock变量的可见性,那么它就是。

如果一个线程调用了该方法并获得了锁定,则另一个线程将被强制等待Monitor.Enter,直到第一个线程调用Monitor.Exit

答案 1 :(得分:0)

lock(Application["Lock"])
{
    salbapi.Sislemcu_Epayroll_Salffs_Bapi(Saljv_str, "N", out messdata, ref     Saljv_table);
}

这确保了关键代码在应用程序中一次只执行一次,无论有多少同时的页面请求。我建议在Application_start上的Global.asax中初始化Application["Lock"]

public class Global : System.Web.HttpApplication
{
    protected void Application_Start(object sender, EventArgs e)        
    {
        Application["Lock"] = new object();
    }

    //other handlers
}

我还建议你为var提出一个更好的名称,以便明确它锁定的内容,并且不会在其他地方重复使用以防止死锁的风险。

答案 2 :(得分:0)

简短回答都铎是正确的。答案很长:

moniter.enter对于这个逻辑来说有点低。尝试使用lock语句,它是'monitor.enter();的糖。最后尝试{...}(监视退出)'。此外,捕捉和吃一个例外是非常糟糕的形式;让异常冒泡,以便报告。

我会做像

这样的事情
  class Foo
  {
     static object synch = new object();

     void TheMethod()
     {
        lock (synch)
        {
           salbapi.Sislemcu_Epayroll_Salffs_Bapi(...);
        }
     }

}