2012-06-27 41 views
2

我有用戶控制我的網站地圖已在ASCX以下:C#動態地圖內存泄露

<asp:SiteMapPath id="SiteMapPath1"runat="server" RenderCurrentNodeAsLink="true" /> 

這個Sitemap控制被稱爲我的網站的每個頁面上。

背後的用戶的控制碼:

private void Page_Load(object sender, EventArgs e) 
{ 
    SiteMap.SiteMapResolve += new SiteMapResolveEventHandler(this.ExpandForumPaths); 
} 
private SiteMapNode ExpandForumPaths(Object sender, SiteMapResolveEventArgs e) 
{ 
    SiteMapNode currentNode = SiteMap.CurrentNode.Clone(true); 
    SiteMapNode tempNode = currentNode; 

    if (0 != postID) 
    { 
     tempNode.Url = tempNode.Url + "?PostID=" + postID.ToString(); 
    } 

    if ((null != (tempNode = tempNode.ParentNode)) && 
     (0 != forumID)) 
    { 
     tempNode.Url = tempNode.Url + "?ForumID=" + forumID.ToString(); 
    } 

    if ((null != (tempNode = tempNode.ParentNode)) && 
     (0 != forumGroupID)) 
    { 
     tempNode.Url = tempNode.Url + "?ForumGroupID=" + forumGroupID.ToString(); 
    } 

    return currentNode; 
} 

的問題是,它是耗時1 - 每頁的負載壓頭2 MB,並且不釋放存儲器回來。例如,如果我刷新頁面2 MB添加到w3wp.exe,它不斷增長。

SiteMap.SiteMapResolve += new SiteMapResolveEventHandler(this.ExpandForumPaths); 

我相信上面一行是通過創建每次使用我的用戶控制時間一個新的事件處理程序導致了問題。

問題這種製作動態站點地圖的方法失敗。有沒有其他的方式來消除記憶,或者我做錯了什麼?

+2

東西你試過做一個'SiteMap.SiteMapResolve - = this.ExpandForumPaths'頁面卸載事件? 「SiteMap.SiteMapResolve」是靜態的,因此每個頁面加載時處理程序都在堆疊。 –

+0

@thecoon,對於遲到的回覆感到抱歉,是的,我做了SiteMap.SiteMapResolve - = this.ExpandForumPaths;但它沒有效果,但如果我強制GC.Collect();卸載w3wp.exe進程停止使用內存。 –

+0

@ AI25如果確實如此(在強制GC.Collect()調用中沒有內存增長),這意味着沒有內存泄漏,而只是選擇消耗新資源而不是重新使用現有資源的進程。當操作系統請求清理(導致自動垃圾回收)時,應該返回你的內存。你發現這不是這樣嗎? –

回答

0

你有沒有想過有這行代碼

SiteMap.SiteMapResolve -= this.ExpandForumPaths 
2

你可以讓你的網站地圖在一個靜態緩存,只存儲當前的節點ID(S)對用戶拆卸處理爲好。內存1-2mb表明你正在爲每個用戶建立一個站點地圖(更不用說每個請求了),這看起來有點過分。

var nodes = Session["ExpandedNodes"] as List<integer> 
AddCurrentPageToExpandedNodes(nodes) 
var siteMapForUser = StaticSiteMap.Apply(nodes)