繁体   English   中英

ASP.NET 非静态 Class 内部 Static Class 线程安全

[英]ASP.NET Non-Static Class Within a Static Class Thread-Safety

堆栈溢出。 假设我要初始化一个非静态变量 class,其中两个是 UserID (int) 和 MyDictionary (Dictionary)。 此非静态 class 在 static class 中声明(并在 static 类的成员之一中初始化)。 如果脚本运行时间过长并且另一个用户访问同一页面,则新用户有可能会更改其他用户的 MyDictionary 的内容。 但我不明白这是怎么可能的,因为 MyDictionary 在非静态 class 中。有人明白吗? 谢谢你。

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

我可以编写 static 不是线程安全的代码(就像您在问题中描述的代码),我可以编写线程安全的实例代码,反之亦然。 这是一些非线程安全的(错误的)代码,或多或少与我认为您正在做的事情一致:

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 object 或(对于长期数据)数据库。 永远不要依赖 static 变量——如果两个用户同时访问网站怎么办?

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

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);
    }
}

通过将 static class 内的 object 声明为 static 变量,您基本上是在说“在我的应用程序中,我想要其中之一;并且只有其中之一”; 所以即使 class 不是 static; 您仍在创建它的 static 实例。

因为包含class,访问成员是static,所以使用单数memory空间。 您必须假设 static 类的引用(在本例中为局部变量、字段或属性)也是 static(即使它们是非静态类的实例)。

class 首先是 static 的原因是什么? 如果您使用共享逻辑,为什么不通过对 static 方法的引用传递 Dictionary?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM