ASP.NET应用程序对象Getter和Setter

时间:2012-11-04 21:21:18

标签: c# asp.net .net getter-setter

我很难找到访问应用程序对象的新手友好示例。我想在Application Object中存储一些东西(数组),以便在AppRecycle之前保持持续数据约2小时。

无论如何,我知道如何以这种方式设置Application Object变量:

// One way
String[] users = new String[1000];
Application["users"] = users;

// Another way
Application.Add("users", users);

但是,一旦它们在Application Object中,我不知道如何访问这些变量。有一个Getter方法Get。但是它需要int index。另一种方法Contents得到了所有东西,而不仅仅是我的数组。

这里我尝试检索我的String []数组,但它给了我一个错误,我试图将Object转换为String。

String[] usersTable = Application["users"];
// Since this is an object i also tried Application.users but gives error

4 个答案:

答案 0 :(得分:4)

在应用程序中,您只保存类型“对象”。您需要转换为所需的类型

string[] usersTable = (string[])Application["users"];

答案 1 :(得分:3)

您需要将值转回String[]

String[] usersTable = (String[])Application["users"];

请参阅如何:Read Values from Application State

答案 2 :(得分:2)

首先,我建议您的案例在字符串

上使用静态变量
static String[] users = new String[1000];

并操纵它。比应用程序状态更好。 What Microsoft says about

  

ASP.NET包括主要用于兼容的应用程序状态   经典ASP,以便更容易地迁移现有的应用程序   ASP.NET。 建议您将数据存储在静态成员中   应用程序类而不是Application对象。这个   提高性能,因为您可以更快地访问静态变量   您可以访问应用程序词典中的项目。

现在,如果您继续使用该应用程序,我强烈建议您在操作应用程序的数据时使用Application.Lock();Application.UnLock();,并且您的代码将如下:

String[] _users = null;
String[] users
{
    get
    {
        if (_users == null)
        {
            Application.Lock();
            if (!(Application["_users_"] is String[]))
            {
                Application["_users_"] = new String[1000];
            }
            _users = (String [])Application["_users_"];
            Application.UnLock();
        }

        return _users;
    }
}

为什么我建议简单地使用静态?

因为Application["_users_"]实际上是对存储在其他数据中的静态Dictionary<k,v>的调用,以及您设置为String []的数据。实际上没有理由这样做,静态也可以做到这一点。

答案 3 :(得分:0)

更好的解决方案,IMO,将使用WebCache(http://msdn.microsoft.com/en-us/library/d59zceh7.aspx),因为您可以拥有超过到期和依赖的控制量。这样,如果您不再需要重新启动应用程序池,您仍可以将数据保留在有限的设定时间段内。

         string[] Cache["users"];

这就是访问对象缓存所需的全部内容。设置它也很容易。请参阅:http://msdn.microsoft.com/en-us/library/system.web.caching.cache.add(v=vs.100).aspx