我知道这可能是一项简单的任务,但我无法找到如何实现这一目标的好例子。在我的asp应用程序中,我有一个用户可以更新的TextBox。我正在寻找一种方法将此变量的值存储在一个中心位置,以便TextBox的Text属性设置为访问该页面的任何用户的该变量。此外,此变量应保持不变,直到另一个用户更新它。 最糟糕的是,我可以创建一个数据库表来存储这个值并从那里拉出来,但我想象asp或IIS会内置这个功能。
答案 0 :(得分:3)
您可能正在寻找的内容称为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集合非常重要。这是通过首先锁定然后解锁集合来完成的,如下所示:
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方法。
详细了解concurrency concerns here。
可扩展性问题
正如 John Saunders 和 Servy 在评论中指出的那样,如果您的应用需要考虑扩展,就像在运行多个Web服务器的Web场/云场景中一样在应用程序中,建议您考虑使用数据库解决方案来维护持久数据。然后,您可以独立于Web服务器扩展数据库需求,它也可以处理一些并发问题。但是,您可能仍希望在此方案中使用“应用程序状态”来缓存未经常更新的数据。
答案 1 :(得分:2)
如果只有一个Web服务器,则可以使用“应用程序”状态,但“应用程序状态”不适用于Web场。如果您的应用程序将在Web场上运行,并且您的状态需要在多个Web服务器之间共享,那么您应该使用集中存储(DB)。
如果“应用程序状态”适用于您,请确保在对其进行更改之前没有锁定和解锁应用程序对象的竞争条件
Application.Lock();
Application["myMessage"] = newValue;
Application.UnLock();