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

如何知道应用程序级别变量何时更改asp.net,asp.net,variables,onchange,global-asax,notify,Asp.net,Variables,Onchange,Global Asax,Notify,我将应用程序级变量存储在global.asax文件的缓存中: void应用程序\u启动(对象发送方,事件参数e) { Application.Lock(); List myobjects=new List(); HttpContext.Current.Cache[“List”]=myobjects; Application.UnLock(); } 我在页面中访问并更改它: protected void Page_Load(object sender, EventArgs e) { Lis

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

void应用程序\u启动(对象发送方,事件参数e)
{
Application.Lock();
List myobjects=new List();
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;
}
受保护的无效页面加载(对象发送方,事件参数e)
{
List myobjects=(List)HttpContext.Current.Cache[“List”];
//更改MyObject。。。
HttpContext.Current.Cache[“List”]=myobjects;
}
问题是: *假设我们有两个用户(浏览器)同时运行这个站点(例如,他们正在聊天)。当一个用户更改MyObject变量时,如何通知另一个用户*

我们可以使用定时器定期检查MyObject并将其与旧对象进行比较。但这不是最好的办法


那么,当全局变量发生变化时,有没有更好的方法通知另一个用户呢?

对于Web服务器,考虑到http协议的无状态性,没有什么比用户或连接的用户更好的了,只有一个请求及其响应。当你说,你想通知一个用户,你试图说,服务器将启动通信,这是不可能的

一个想法可能是,您可以使用长轮询,即保持请求持续有效,并且无论何时您想要通知用户,您都会输入数据,但这不是一个可扩展的解决方案-至少对于资源较低的服务器而言(当然,谷歌可以负担得起)

为了通知任何事情,用户必须连接到服务器,即通信必须从客户端启动


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

对于Web服务器,考虑到http协议的无状态性,没有什么像用户或连接的用户,只有一个请求及其响应。当你说,你想通知一个用户,你试图说,服务器将启动通信,这是不可能的

一个想法可能是,您可以使用长轮询,即保持请求持续有效,并且无论何时您想要通知用户,您都会输入数据,但这不是一个可扩展的解决方案-至少对于资源较低的服务器而言(当然,谷歌可以负担得起)

为了通知任何事情,用户必须连接到服务器,即通信必须从客户端启动


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

这很有趣,但是,您能否解释一下,您是如何在应用程序本身中引发事件或通知的,即值已更改,以及需要通知的用户数实际上通知用户的是一个不同的故事,每个应用程序内部都有计时器,这个计时器定期访问全局变量并进行复制,一段时间后,计时器再次访问全局变量并比较这个旧的复制变量。如果它们不同,则计时器更新页面或执行其他操作。因此,每个用户都会自行检查任何更改。但这不是最好的方法。这很有趣,但是,您能否解释一下,您是如何设法在应用程序本身中引发事件或通知的,即值已更改,需要通知的用户数量是多少实际上通知用户的是一个不同的故事,每个应用程序内部都有计时器,这个计时器定期访问全局变量并进行复制,一段时间后,计时器再次访问全局变量并比较这个旧的复制变量。如果它们不同,则计时器更新页面或执行其他操作。因此,每个用户都会自行检查任何更改。但这不是最好的办法。
protected void Page_Load(object sender, EventArgs e)
{
   List<MyClassName> myobjects = (List<MyClassname>)HttpContext.Current.Cache["List"];
   //change myobjects...
   HttpContext.Current.Cache["List"] = myobjects;
}