嗨,我在以下的内容中尝试在完成某些任务后删除会话。但是session.remove()在这里没有工作。
if (Session["CaseNumber"] != "" || Session["CaseNumber"] != null)
{
casenumber = Session["CaseNumber"].ToString();
guid = Session["guid"].ToString();
_duration = bal.viewServiceActivity(guid);
case1 = bal.viewCaseDetail(casenumber);
dt = bal.getRelatedNotes(guid);
Session.Remove("CaseNumber");
Session.Remove("guid");
}
else
{
casenumber = Session["searchCase"].ToString();
guid = Session["caseGuid"].ToString();
_duration = bal.viewServiceActivity(guid);
case1 = bal.viewCaseDetail(casenumber);
dt = bal.getRelatedNotes(guid);
Session.Remove("searchCase");
Session.Remove("caseGuid");
}
答案 0 :(得分:3)
上面显示的部分代码没有什么问题。只需了解它是如何工作的。
Session.Remove(key)
删除会话字典中用于密钥的内存。当使用第二种方法:Session["searchCase"]=null;
时,密钥仍然存在于会话中,尽管该值为空。
尝试将Session["Key_Name"]
设置为null
。例如:
if (Session["CaseNumber"] != "" || Session["CaseNumber"] != null)
{
casenumber = Session["CaseNumber"].ToString();
guid = Session["guid"].ToString();
_duration = bal.viewServiceActivity(guid);
case1 = bal.viewCaseDetail(casenumber);
dt = bal.getRelatedNotes(guid);
Session["CaseNumber"] = null; // Set NULL
Session["guid"] = null; // Set NULL
}
Session.Remove()
并没有绕过对象引用和内存管理的所有基本.net规则来销毁对象。您需要了解的是Session.Remove()
正是它的建议:它从内部集合中删除对象的引用。没什么可期待的。
如果您需要销毁某些内容,则需要实施IDisposable
,此外,如果您急于使用GC.Collect()
,则可以指示垃圾收集器收集。
检查此问题:Proper use of the IDisposable interface
Microsoft Forum也证实了这一点。
它似乎更像是一种优化或所谓的标准实施方式。
当您删除某个对象时,它会被标记为删除对象'但没有真正删除......除非需要空间。
垃圾收集的工作原理。仅仅因为一个对象超出范围并不意味着它的析构函数被调用并且内存立即被释放。可能GC
可以在以后删除对象。
尽管如此,作为最后一项检查,请执行此操作:
确保您没有查看该页面的缓存版本,或者您没有在应用程序的某个位置再次将该项目添加到Session对象。