3

我很难找到一个访问应用程序对象的新手友好示例。我有一些东西(数组)我想存储在应用程序对象中作为持久数据保留大约 2 小时,直到 AppRecycle。

无论如何,我知道如何以这种方式设置应用程序对象变量:

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

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

但是,一旦它们位于应用程序对象中,我不知道如何访问这些变量。有一个 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

4 回答 4

4

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

string[] usersTable = (string[])Application["users"];
于 2012-11-04T21:24:36.533 回答
3

您需要将值转换回String[]

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

请参阅如何:从应用程序状态读取值

于 2012-11-04T21:23:33.667 回答
2

首先,我建议您在字符串上简单地使用静态变量

static String[] users = new String[1000];

并操纵它。优于应用程序状态。微软怎么说

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

现在,如果您继续使用应用程序,我强烈建议您使用 useApplication.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;
    }
}

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

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

于 2012-11-04T21:35:32.987 回答
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

于 2012-11-05T04:57:09.110 回答