跨多个请求的静态变量

时间:2010-10-27 23:14:42

标签: asp.net multithreading static-members

为了提高聊天应用程序的速度,我记得静态变量中的最后一条消息ID(实际上是字典)。

然而,似乎每个线程都有自己的副本,因为用户没有获得生产更新(单一服务器环境)。

private static Dictionary<long, MemoryChatRoom> _chatRooms = new Dictionary<long, MemoryChatRoom>();

没有使用stepstaticattribute ...

在所有应用程序流程中分享少量整数的快速方法是什么?

更新

我知道网络必须是无国籍的。但是,对于每个规则都有例外。目前所有数据都以ms sql为单位,在这种特殊情况下,某些共享内存将大大提高性能,并且可以避免sql请求。

我多年没有使用静态,所以我甚至错过了在同一个应用程序中开始出现多个实例的时刻。

那么,问题是在进程之间共享内存对象的最简单方法是什么?目前,我的解决方法是远程处理,但是有很多额外的代码,我对这种方法的稳定性并不是100%肯定。

2 个答案:

答案 0 :(得分:2)

我假设你是网络编程的新手。 Web应用程序与常规控制台或Windows窗体应用程序的主要区别之一是无状态。这意味着每个页面请求基本上都是从头开始初始化的。您正在使用数据库来维护状态,但是当您发现这是相当慢的时候。幸运的是,你还有其他选择。

如果您想记住每个用户经常访问的内容(比如用户名),那么您可以使用会话。我建议阅读会话状态here。但是,请注意不要滥用会话对象 - 因为每个用户都有自己的会话副本,它可以轻松地使用大量RAM并导致比数据库更多的性能问题。

如果要缓存与应用程序的所有用户相关的信息,ASP.NET会提供framework for data caching。使用它的最简单方法就像字典,例如:

Cache["item"] = "Some cached data";

我建议详细阅读ASP.NET here中缓存的各种选项。

总的来说,我建议您在使用网络编程之前不要轻易进行缓存。与任何类型的全局共享数据一样,它可能导致不可预测的问题,如果误用则难以诊断。

答案 1 :(得分:1)

到目前为止,没有简单的方法可以在进程之间进行通信。 (也许这可以基于隔离,缩放来实现)。例如,这里明确提到:ASP.Net static objects

如果您真的需要Web应用程序/服务来记住内存中的某些状态,而不是数据库中有以下选项:

  1. 您可以将Max Processes count = 1.要求将此段代码移动到单独的Web应用程序。如果您将其设为单独的子域,则从JS访问时会出现跨站点脚本问题。

  2. 远程处理/ WCF - 您可以在远程应用程序中托管关键数据,并从Web应用程序访问它。

  3. 在每个进程中存储数据,并通过memcached同步更改。 Memcached没有实际数据,因为它需要很长的时间来传输它。每个集合仅上次更改日期。

  4. 使用#3,我可以从单台服务器获得每秒超过100页的内容。