垃圾收集器如何处理ASP.NET MVC中的会话

时间:2014-09-24 06:55:07

标签: c# asp.net asp.net-mvc session garbage-collection

public Dictionary<string, IMYObject> MYObjectContainer
{
    get
    {
        if (Session["MYObjectPool"] == null)
            Session["MYObjectPool"] = new Dictionary<string,IMYObject>();
        return (Dictionary<string, IMYObject>)Session["MYObjectPool"];
    }
    set
    {
        Session["MYObjectPool"] = value;
    }
}

public ActionResult Close()
{
    try
    {
        MyObject obj = this.MYObjectContainer["Key"] 
        this.MYObjectContainer = null;             
        return Json(new { success = true }, JsonRequestBehavior.AllowGet);
    }
    catch (Exception Ex)
    {
        throw X
    }
}

当对象没有有效的裁判时,垃圾收集器将被删除 这里有两名裁判,

1.obj(局部变量)

2.Session

首先,我通过设置this.MYObjectContainer = null;使会话裁判无效 第二,当函数结束时,obj将从堆栈弹出,因此第二裁判无效

这是否使MYObjectContainer有资格清除垃圾收集器?

如果我的问题完全错误,请忽略,请告诉我?

垃圾收集器如何在ASP.NET会话中工作?

1 个答案:

答案 0 :(得分:2)

在上面的示例中,在会话超时之前,Session对象不会被垃圾收集。

你必须决定这是否是你想要的行为:) - 你以后需要这个对象吗?

如果你想从Session中删除对象,你还必须写Session["MYObjectPool"] = nullSession.Remove("MYObjectPool")(也会这样做)

很多时候在Session中放置对象不是问题,但是如果对象很大(例如兆字节甚至千兆字节)和/或你有很多用户(所有人都会得到他们自己的会话)或许多网站在有相关物品的同一台服务器上将是一个问题。

会话很方便,但你必须意识到它的局限性......