这是一个有趣的问题。我正在开发一个网络聊天软件,在过去的几个小时里,我一直试图弄清楚为什么会这样。基本上,当您开始聊天时,我会向Cache集合添加一个实际的聊天对象(进行通信的部分)。为了检测你关闭了窗口,我将滑动过期设置为10-30秒。我还设置了回调,让聊天客户端知道他需要断开连接以结束聊天会话。出于某些奇怪的原因,当我使用代码处理聊天客户端时,无论它是什么,它都会导致整个w3svc进程崩溃(检查事件日志)。当项目被移除时,我也尝试向自己发送一封电子邮件。我甚至试图将整个代码放在try-catch块中,但它似乎也忽略了它。有任何想法吗? O_O
UPD :不,我不是要刷新对象(in reference to this)。
添加:
HttpContext.Current.Cache.Insert("ChatClient_" + targetCid + HttpContext.Current.Session.SessionID, cl, null, Cache.NoAbsoluteExpiration,
TimeSpan.FromSeconds(15), CacheItemPriority.Normal, new CacheItemRemovedCallback(removeMyself));
卸下:
public static void removeMyself(string key, Object value, CacheItemRemovedReason reason) {
var wc = (WebClient)value;
try {
wc.Remove();
}
catch { }
}
我实际上在添加到缓存对象时使用HttpContext.Current.cache上的锁。
答案 0 :(得分:0)
你可以发布cache.insert和项目删除的回调代码吗?您是否在插入缓存时使用任何类型的锁定?你有没有做过ASP.net缓存的默认设置?你能在其他网络服务器上重现这个吗?你确定你的缓存是以ms为单位而不是秒......
你的滑动过期是这样的吗? TimeSpan.FromSeconds(30)