У меня есть пользовательский элемент управления для моего сайта, который имеет следующие в 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 каждый раз, когда используется мой пользовательский элемент управления.
Вопрос Этот способ создания динамической карты сайта не удался. Есть ли другой способ сделать это, не потребляя память, или я делаю что-то неправильно?
Вы пробовали делать 'SiteMap.SiteMapResolve - = this.ExpandForumPaths' на события страницы Выгрузка? «SiteMap.SiteMapResolve» является статическим, поэтому обработчики продолжают накапливаться там для каждой загрузки страницы. –
@thecoon, извините за поздний ответ, да, я сделал SiteMap.SiteMapResolve - = this.ExpandForumPaths; но это не имеет никакого эффекта, но если я действительно использую GC.Collect(); при выгрузке процесс w3wp.exe перестает потреблять память. –
@ AI25 Если это действительно так (рост памяти при принудительных вызовах GC.Collect()), это означает, что утечка памяти отсутствует, а просто процесс, требующий использования новых ресурсов, а не повторное использование существующих ресурсов. Когда операционная система запрашивает очистку (вызывая автоматическую сборку мусора), ваша память должна быть возвращена. Вы нашли, что это не так? –