2012-06-27 2 views
2

У меня есть пользовательский элемент управления для моего сайта, который имеет следующие в ASCX:C# динамическая карта сайта утечку памяти

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

Этот контроль карта сайта называется на каждой странице моего сайта.

И пользовательский элемент управления код позади:

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 добавляется в w3wp.exe, она продолжает расти.

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

я считаю, что линия выше вызывает проблему, создав новый EventHandler каждый раз, когда используется мой пользовательский элемент управления.

Вопрос Этот способ создания динамической карты сайта не удался. Есть ли другой способ сделать это, не потребляя память, или я делаю что-то неправильно?

+2

Вы пробовали делать 'SiteMap.SiteMapResolve - = this.ExpandForumPaths' на события страницы Выгрузка? «SiteMap.SiteMapResolve» является статическим, поэтому обработчики продолжают накапливаться там для каждой загрузки страницы. –

+0

@thecoon, извините за поздний ответ, да, я сделал SiteMap.SiteMapResolve - = this.ExpandForumPaths; но это не имеет никакого эффекта, но если я действительно использую GC.Collect(); при выгрузке процесс w3wp.exe перестает потреблять память. –

+0

@ AI25 Если это действительно так (рост памяти при принудительных вызовах GC.Collect()), это означает, что утечка памяти отсутствует, а просто процесс, требующий использования новых ресурсов, а не повторное использование существующих ресурсов. Когда операционная система запрашивает очистку (вызывая автоматическую сборку мусора), ваша память должна быть возвращена. Вы нашли, что это не так? –

ответ

5

http://netpl.blogspot.com/2008/04/sitemapresolve-and-dynamic-site-map.html

Согласно вышеуказанной статье, на каждом Page_Load нового SiteMapResolveEventHandler добавляется потому, что SiteMapResolve статична, кажется, хороший повод для ненужного чрезмерного выделения памяти. Статья также имеет обходное решение.

+0

спасибо за ответ, я попробую и дам вам знать ... –

0

вы думали об удалении обработчика, а также с этой строкой кода

SiteMap.SiteMapResolve -= this.ExpandForumPaths 
2

Вы можете сохранить вашу карту сайта в одном статическом кэше и хранить только текущий идентификатор узла (ов) по отношению к пользователю. 1-2 МБ оперативной памяти предполагает, что вы создаете карту сайта для каждого пользователя (не говоря уже о каждом запросе), который кажется излишним.

Что-то вроде

var nodes = Session["ExpandedNodes"] as List<integer> 
AddCurrentPageToExpandedNodes(nodes) 
var siteMapForUser = StaticSiteMap.Apply(nodes) 
Смежные вопросы