2014-09-24 22 views
1
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 
    } 
} 

當對象沒有有效的裁判 這裏有兩個裁判的垃圾回收器會刪除,垃圾收集器將如何處理會話在ASP.NET MVC

1.obj(局部變量)

2.Session

首先,我通過設置this.MYObjectContainer = null; 二當函數結束的物鏡將被彈出棧從而第二裁判無效取得的會話裁判無效

這是否使得MYObjectContainer符合清理垃圾收集器的條件?

請忽略我的問題是否完全錯誤,請指教我?

垃圾收集器如何在ASP.NET會話中工作?

+0

垃圾收集器將破壞會話的會話超時的間接後果。我的建議是不要擔心這方面的垃圾收集。 – krisdyson 2014-09-24 06:59:54

+0

On註銷如果我使用Session.Abandon(),這也會使垃圾收集器立即銷燬會話。 – Krishjs 2014-09-24 07:34:16

+0

'當對象沒有有效引用時,垃圾收集器將會刪除 - 這是錯誤的。你有沒有[閱讀.NET上的垃圾收集文檔](http://msdn.microsoft.com/en-us/library/0xy59wtx%28v=vs.110%29.aspx)? – Aaronaught 2014-12-26 21:09:48

回答

1

在上例中,Session對象在會話超時之前不會被垃圾收集。

你必須決定這是否是你想要的行爲或不:)以後你會需要這個對象嗎?

如果你想刪除會話對象,你也得寫Session["MYObjectPool"] = nullSession.Remove("MYObjectPool")(這也將這樣做),其在會議奠定周圍物體

很多時候是沒有問題的,但如果對象很大(例如兆字節或甚至千兆字節)和/或您有很多用戶(所有人都將獲得他們自己的會話),或者在同一臺服務器上有許多站點放置對象的站點會成爲問題。

會議是很方便的,但你必須認識到其侷限性...