Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 监控。输入(锁定)问题_C#_Asp.net_Multithreading - Fatal编程技术网

C# 监控。输入(锁定)问题

C# 监控。输入(锁定)问题,c#,asp.net,multithreading,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

我正在用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).
}
现在假设两个用户同时访问该函数

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


这不应该发生。

您是否在询问这是否是线程安全的?如果所有线程都具有lock变量的可见性,则为yes

如果一个线程调用了该方法并获得了锁,则通过的另一个线程将被迫在
Monitor处等待。输入
,直到第一个线程调用了
Monitor。退出

lock(Application["Lock"])
{
    salbapi.Sislemcu_Epayroll_Salffs_Bapi(Saljv_str, "N", out messdata, ref     Saljv_table);
}
这确保了关键代码在应用程序中一次只执行一次,而不管同时有多少个页面请求。我建议在应用程序启动时在Global.asax中初始化
应用程序[“Lock”]

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

    //other handlers
}

我还建议您为var取一个更好的名称,这样就可以清楚地知道它锁定了什么,并且不要在其他地方重复使用它,以免出现死锁风险。

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

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

我会做类似的事情

  class Foo
  {
     static object synch = new object();

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

}

我使用了它,但是锁中的代码执行了不止一次,请参见编辑。您需要使用页面实例之间共享的锁对象。请记住,页面的每个请求都会导致给定页面类的一个新实例,因此具有类作用域的锁变量不会在请求之间共享。这将在页面事件处理程序的上下文中失败,因为synch是类级别的变量,我们需要使用应用程序级别的变量(或定义一个单例,效果相同)根据我下面的回答,以满足要求。@RichardSchneider这对我来说是可行的,但问题是现在有两个用户正在访问它。第二个用户等待第1个完成,当两个都完成时,第一个用户的结果显示给第二个,反之亦然。。。不知道为什么会出现这种情况?您确定此代码正在单个辅助进程中运行吗?如果没有,您可以创建所需的所有监视器,但它们不会跨进程同步。@kumar如果其中一个答案是您所需的答案,则最好将其标记为该答案。