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】:

如果ErrorMessageDoSomething 设置,则不是线程安全的。如果在 if 测试之后和分配之前获得上下文切换,它可能会被另一个线程重新分配。静态字段是静态的,与包含的类是否为静态无关。

摆脱您的 C 风格返回代码,改为在错误时抛出异常。

【讨论】:

对,我想也许我是在自言自语……我可能只是将方法设为非静态并实例化 MyClass。这有效,无论它是否在 Asp.Net 页面中,是吗? @Serexx:如果您不共享实例,那么是的,它将是线程安全的。【参考方案2】:

不,您的代码不是线程安全的。不管你的类是否是静态的,静态变量都可以被访问并保持状态。其他线程可以在您的控件返回之前轻松修改 this 变量的内容。

【讨论】:

以上是关于Asp.net C# 静态方法线程安全错误处理的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET MVC 如何使一种方法只能由一个线程同时执行?

七天学会ASP.NET MVC ——线程问题异常处理自定义URL

asp.net(C#) 是 多线程吗

如何将我的请求中的安全主体传递到 asp.net MVC 中的线程中

七天学会ASP.NET MVC ——线程问题异常处理自定义URL

C# 在多线程环境中,进行安全遍历操作