1

我知道这可能是一项简单的任务,但我还没有找到一个很好的例子来说明如何完成这个任务。在我的 asp 应用程序中,我有一个用户可以更新的 TextBox。我正在寻找一种方法将此变量的值存储在一个中心位置,以便为访问该页面的任何用户设置 TextBox 的 Text 属性为该变量。此外,此变量应持续存在,直到另一个用户对其进行更新。最糟糕的是,我可以创建一个数据库表来存储这个值并从那里提取它,但我想象 asp 或 IIS 会内置这个功能。

4

2 回答 2

4

您可能正在寻找的内容称为Application State.

您可以按如下方式使用它:

Application["Message"] = "Welcome to the Contoso site.";

您甚至可以存储对象,例如 List:

Application["MyList"] = new List<string>();

List<string> myList = Application["MyList"] as List<string>;
myList.Add("Test");

并发问题

正如Vlad Bezden 所补充的,在多个线程尝试同时修改应用程序集合的情况下,同步应用程序集合非常重要。这是通过首先锁定然后解锁集合来完成的,如下所示:

Application.Lock();
//Do any code that modifies or retrieves a value from the collection here
Application['MyMessage'] = "MyMessage";
MyClass myObject = Application['MyObject'] as MyClass;
Application.UnLock(); //Make sure you unlock it, or you will be in for a world of hurt.

应用程序状态是自由线程的,这意味着应用程序状态数据可以被多个线程同时访问。因此,重要的是确保在更新应用程序状态数据时,通过包含内置同步支持以线程安全的方式执行此操作。您可以使用 Lock 和 UnLock 方法通过一次仅锁定一个源写入的数据来确保数据完整性。您还可以通过在 Global.asax 文件的 Application_Start 方法中初始化应用程序状态值来降低并发问题的可能性。

在此处阅读有关并发问题的更多信息。

可扩展性问题

正如John SaundersServy在评论中指出的那样,如果您的应用程序需要考虑扩展,例如在多个 Web 服务器一起运行您的应用程序的网络场/云场景中,那么建议您考虑使用数据库解决方案来维护您的持久数据。然后,您可以独立于 Web 服务器扩展您的数据库需求,它还可以处理一些并发问题。不过,您可能仍希望在这种情况下使用应用程序状态来缓存不经常更新的数据。

于 2013-07-01T19:56:55.387 回答
2

如果您只有一台 Web 服务器,您可以使用应用程序状态,但是应用程序状态将无法在 Web 场上运行。如果您的应用程序要在 Web 农场上运行并且您的状态需要在多个 Web 服务器之间共享,您应该使用集中式存储 (DB)。

如果应用程序状态对您有用,请确保您没有竞争条件,您需要在对其进行更改之前锁定和解锁应用程序对象

Application.Lock();
Application["myMessage"] = newValue;
Application.UnLock();
于 2013-07-01T20:10:56.080 回答