【问题标题】:Is this static variable thread safe in ASP.net c#这个静态变量线程在 ASP.net c# 中是否安全
【发布时间】:2013-02-25 17:21:19
【问题描述】:

我知道这种事情已经在这里被问过很多次了,但我仍然没有完全理解 ASP 中的线程安全。

C#: 其中 Util 是一个静态类,而 theList 是一个静态 List。

Util.theList= new List<Object>();
 Util.theList.Add(someObject);

页面加载一次,然后一秒钟后(回发后 1 秒)填充 Util.theList 并重新加载页面以绑定新填充的列表数据:

this.Repeater.DataSource = Util.theList;
            this.Repeater.DataBind();

每次填充列表时都会被实例化:

Util.theList= new List<Object>(); 

如果这不是线程安全的,我怎样才能使它成为线程安全的? 我不能让列表非静态并且在同一页面上,因为一个单独的问题是,如果数据绑定在 page_load 上,则每次只绑定数据: OnDataBind only fires on first postback

【问题讨论】:

  • 在这种情况下,静态列表能给你带来什么?无论如何,您每次都在实例化列表?
  • 嗨凯尔,它使我可以在第二次回发时访问相同的列表。而如果它不是静态的,则第二次回发时列表将为空
  • 什么 usr 声明是正确的,使用 ViewState 进行回发。

标签: c# asp.net data-binding thread-safety


【解决方案1】:

这显然是不安全的,因为静态变量在请求之间共享。将列表移动到某个特定请求独有的位置,例如页面实例字段。

如果您需要在回发之间传递状态,请使用 ViewState 或其他一些非全局机制。

【讨论】:

  • usr,来自这个链接:asp.net-tutorials.com/state/viewstate 它指出视图状态最适合用于简单数据。我不想存储该页面建议我应该使用会话变量的复杂对象的列表,但对我来说,将这些数据存储在会话变量中有点“黑客”
  • 是会话错误,因为范围错误。您不想为用户访问的所有页面维护此数据。您只希望它用于当前页面。 Session 经常被滥用,它会导致这些烦人的应用程序无法打开多个选项卡。可能的解决方案:在会话中保留一个字典。每个页面都有一个存储在视图状态中的 guid。这让您两全其美。
  • 我会尝试您的解决方案,但没有更好的方法可以做到这一点吗?唯一的问题是该列表仅在 page_load 之后填充。
  • ASP.NET 缺少称为“对话”的功能。对话是仅针对一页或一页流的会话。我建议的字典是该概念的实现。如果你不能使用更简单的 ViewState,我推荐它(为什么不呢?)。
【解决方案2】:

最好同时避免使用静态变量。 静态变量不太适合单元测试。静态类和变量不能被存根或模拟。

但是,在您的实例中,静态变量不是线程安全的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-18
    • 1970-01-01
    • 1970-01-01
    • 2013-10-09
    • 1970-01-01
    相关资源
    最近更新 更多