如何知道应用程序级变量何时更改为asp.net

时间:2012-10-12 12:39:44

标签: asp.net variables onchange global-asax notify

我将应用程序级变量存储在 global.asax 文件的缓存中:

 void Application_Start(object sender, EventArgs e) 
    {
        Application.Lock();
        List<MyClassName> myobjects = new List<MyClassName>();
        HttpContext.Current.Cache["List"] = myobjects;
        Application.UnLock();        
    }

我访问它并在页面中更改它:

protected void Page_Load(object sender, EventArgs e)
{
   List<MyClassName> myobjects = (List<MyClassname>)HttpContext.Current.Cache["List"];
   //change myobjects...
   HttpContext.Current.Cache["List"] = myobjects;
}

问题是: *假设我们有两个用户(浏览器)同时运行此站点(例如他们正在聊天)。当一个用户更改 myobjects 变量时,如何通知其他用户?*

我们可以使用计时器检查myobjects并定期与旧对象进行比较。但这不是最好的方式。

那么更改全局变量时有更好的方法来通知其他用户吗?

1 个答案:

答案 0 :(得分:1)

对于网络服务器,考虑到http协议的无状态,没有像用户或连接用户,只是请求及其响应。当您说,您想通知用户时,您试图说服务器将启动无法进行的通信。

一个想法可能是,您可以使用长轮询,即保持请求持续活跃,并且每当您想要向用户通知某些内容时,您都会输入数据,但同样它不是可扩展的解决方案 - 至少对于低资源服务器(当然谷歌可以负担得起)

为了通知任何内容,用户必须连接到服务器 - 即必须从客户端发起通信。

另一种选择是使用套接字。您可以编写自定义服务器并使Web应用程序通知自定义服务器该值已更改。反过来,自定义服务器将使用套接字(Web套接字)通知客户端。但这是一个相当复杂的机制。您可以使用html 5提供的websockets或使用flash / java之类的插件来计算套接字通信。