【问题标题】:How will the Garbage Collector handle a Session in ASP.NET MVC垃圾收集器将如何处理 ASP.NET MVC 中的会话
【发布时间】:2014-09-24 06:55:06
【问题描述】:
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.会话

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

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

如果我的问题完全错误,请忽略,请指教?

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

【问题讨论】:

  • 垃圾收集器将销毁会话作为会话超时的间接后果。我的建议是不要担心这方面的垃圾收集。
  • 如果我使用 Session.Abandon() 注销,这也会使垃圾收集器立即销毁会话。
  • The garbage collector will delete when the object has no valid refere - 这是错误的。你有read the documentation on garbage collection on .NET吗?
  • 可以说是假的吗?

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


【解决方案1】:

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-30
    • 2011-07-03
    • 1970-01-01
    • 2011-03-29
    相关资源
    最近更新 更多