我正在使用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个用户是否同时访问该功能。
处理的结果消息被交换或不交换(向用户显示错误的消息)。
不应该发生。
答案 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(...);
}
}
}