C# 监控。输入(锁定)问题
我正在用C#在ASP.NET中开发一个网页 许多用户可以同时访问该页面 单击按钮时,我正在调用一个具有关键部分的函数 我已经输入了那个密码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
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如果其中一个答案是您所需的答案,则最好将其标记为该答案。