静态类线程安全中的ASP.NET非静态类

时间:2012-04-10 22:33:07

标签: asp.net thread-safety static

Stack Overflow。假设我想初始化一个非静态变量类,其中两个是UserID(int)和MyDictionary(Dictionary)。这个非静态类在静态类中声明(并在其中一个静态类的成员中初始化)。 如果脚本运行时间较长而另一个用户访问同一页面,则新用户可能会更改其他用户的MyDictionary的内容。但我不知道这是怎么可能的,因为MyDictionary属于非静态类。有谁理解这个?谢谢。

3 个答案:

答案 0 :(得分:1)

静态(或缺乏)会影响线程安全性。静态只是意味着类成员(属性,字段,方法或构造函数)与类型相关联,而不是与类的特定实例相关联。

我可以编写非线程安全的静态代码(比如你在问题中描述的代码),我可以编写线程安全的实例代码,反之亦然。以下是一些非线程安全(错误)代码,或多或少与我认为您正在做的一致:

public static class MyFoo {

    // Just because this is a static property doesn't
    // mean the contained dictionary is thread safe!
    public static Dictionary<String, String> MyDictionary { get; set; }

    public static MyFoo() {
        MyDictionary = new Dictionary<String, String>();
    }
}

如果需要在ASP.NET中存储特定于用户的信息,请使用Session对象或(对于寿命更长的数据)数据库。不要依赖静态变量 - 如果两个用户同时在网站上会怎么样?

答案 1 :(得分:1)

所以我假设代码看起来有点像这样吗?

public class MyNonStaticClass
{
    public int UserID;

    public Dictionary<int, string> MyDictionary 
        = new Dictionary<int, string>;
}

public static class MyStaticClass
{
    public static MyNonStaticClass aStaticInstanceOfTheNonStaticClass 
        = new MyNonStaticClass();

    public static void AddToDictionary(int key, string value)
    {
        aStaticInstanceOfTheNonStaticClass.add(key, value);
    }
}

通过将静态类中的对象声明为静态变量,您基本上是在“在我的应用程序中我想要其中一个;并且只有其中一个”;所以即使班级不是静态的;你还在创建它的静态实例。

答案 2 :(得分:0)

因为包含类和访问成员是静态的,所以它使用奇异的内存空间。您必须假设静态类的引用(在本例中为locals,fields或properties)也是静态的(即使它们是非静态类的实例化)。

这个课程首先是静态的原因是什么?如果您正在使用共享逻辑,为什么不通过引用传递Dictionary来静态方法?