1

嗨,在以下内容中,我试图在完成某些任务后删除会话。但是 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");
        }
4

1 回答 1

3

上面显示的部分代码并没有什么问题。只需要了解它是如何工作的。

Session.Remove(key)删除会话字典中用于键的内存。当使用 : 的第二种方法时Session["searchCase"]=null;,尽管值为空,但密钥仍将存在于 Session 中。

尝试将 设置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()

检查这个 SO 问题:正确使用 IDisposable 接口

微软论坛也证实了这一点。

它似乎更像是一种优化或所谓的标准实现方式。当您移除一个对象时,它会“标记为移除”,但并未真正移除……除非需要空间。这就是垃圾收集的工作原理。仅仅因为一个对象超出范围并不意味着它的析构函数被调用并立即释放内存。可能会GC在很久以后删除一个对象。

不过,作为最后的检查,请执行以下操作

确保您没有查看页面的缓存版本,或者您没有在应用程序的某处再次将该项目添加到 Session 对象。

于 2013-09-04T10:56:24.073 回答