Asp.net C# 静态方法线程安全错误处理
Posted
技术标签:
【中文标题】Asp.net C# 静态方法线程安全错误处理【英文标题】:Asp.net C# Static Method Thread Safe Error Handling 【发布时间】:2012-02-14 23:01:27 【问题描述】:有时,你以为你知道的简单事情会让你头晕目眩......
我有一个 Asp.Net(表单)应用程序,它使用非静态类的静态方法对 PostBack 进行一些处理。这些方法需要返回 bool。
当静态方法中出现错误时,我不希望只将异常抛回页面级代码,而是在静态方法中显式处理并返回 false。
我可能想多了,但是,如果 MyClass 有一个静态 ErrorMessage 字段,在页面中使用如下:
if(!MyClass.DoSomething)
errorLabel.Text = MyClass.ErrorMessage; //Static ErrorMessage is set
ErrorMessage 实际上是线程安全的,因为 MyClass 是非静态的,Page 存在于特定的 HttpContext 中并且变量在 PostBack 上被销毁,我对吗?
有没有理由不这样做,或者有更好的方法?
【问题讨论】:
【参考方案1】:如果ErrorMessage
由DoSomething
设置,则不是线程安全的。如果在 if 测试之后和分配之前获得上下文切换,它可能会被另一个线程重新分配。静态字段是静态的,与包含的类是否为静态无关。
摆脱您的 C 风格返回代码,改为在错误时抛出异常。
【讨论】:
对,我想也许我是在自言自语……我可能只是将方法设为非静态并实例化 MyClass。这有效,无论它是否在 Asp.Net 页面中,是吗? @Serexx:如果您不共享实例,那么是的,它将是线程安全的。【参考方案2】:不,您的代码不是线程安全的。不管你的类是否是静态的,静态变量都可以被访问并保持状态。其他线程可以在您的控件返回之前轻松修改 this 变量的内容。
【讨论】:
以上是关于Asp.net C# 静态方法线程安全错误处理的主要内容,如果未能解决你的问题,请参考以下文章
ASP.NET MVC 如何使一种方法只能由一个线程同时执行?
七天学会ASP.NET MVC ——线程问题异常处理自定义URL
如何将我的请求中的安全主体传递到 asp.net MVC 中的线程中