ASP.NET WebApp Проблемы с производительностью: как решить? - PullRequest
1 голос
/ 22 августа 2011

Я пытался выявить некоторые проблемы с производительностью нашего веб-приложения ASP.NET.Это онлайн-приложение, которым пользуются несколько пользователей (10+).Просто краткий обзор: приложение использует комбинацию веб-форм, страниц MVC, веб-сервисов и т. Д. Когда несколько пользователей подключаются к приложению, оно кажется очень медленным.После исследования памяти кажется, что приложение использует ОЧЕНЬ много памяти, и это замедляет работу машины, что указывает на то, что неуправляемые ресурсы не утилизируются.Я установил ANTS, а затем захватил несколько приложений в системе.Оказывается, много памяти используется неуправляемыми ресурсами: http://tinypic.com/r/154ujra/7

Это первый раз, когда я профилирую память.Профилировщик ANTS указывает, что один из моих классов (ПРАВИЛО) имеет большое количество живых экземпляров: http://tinypic.com/r/1264ltu/7 (который, похоже, не освобожден GC)

После детализации в классеlevel http://tinypic.com/r/2r3v6nq/7, отображает предупреждение о том, что класс не освобождается из памяти, и это может быть из-за того, что обработчик событий не был незарегистрированным.Теперь этот класс содержит экземпляр обработчика событий, так может ли это быть?

public class Rule
{
    public event EventHandler deleted;

    public void Delete()
    {
        if (baseQuestionnaire.basePortfolio.mode != Mode.Admin)
        {
            throw new Exception("Rules can only be deleted in Admin mode");
        }
        else
        {
            // Delete the rule from the database
            if (id != -1)
            {
                string delete = "DELETE FROM tb" + DataManager.dbPrefix + "_QuestionRule WHERE QuestionRuleId = " + id.ToString();
                DataManager.execute(delete);
            }

            // Raise a deleted event
            if (deleted != null)
                deleted(this, new EventArgs());
        }
    }
 } 

Событие затем назначается в другом классе, как этот, но никогда не регистрируется

public class Option : IComparable
{

    public void AddRule(Rule newRule)
    {
        newRule.deleted += new EventHandler(newRule_deleted);
        allRules.Add(newRule);
    }

    ............................
 }

1 Ответ

1 голос
/ 22 августа 2011

Хм .. Я вижу, что обработчик событий "удален" является публичным. Поэтому я предполагаю, что сначала создается объект Rule, а затем Rule.deleted назначается обработчик событий. Если это так, то, как вы и подозревали, обработчик событий, вероятно, является причиной того, что объекты Rule не собираются сборщиком мусора.

EDIT:

Может быть, вы могли бы попробовать что-то вроде этого:

public class Option : IComparable, IDisposable
{

    private Rule newRule;
    private EventHandler newRuleDeletedEventHandler;

    public void AddRule(Rule newRule)
    {
        this.newRule = newRule;
        newRuleDeletedEventHandler = new EventHandler(newRule_deleted);
        newRule.deleted += newRuleDeletedEventHandler;
        allRules.Add(newRule);
    }

    public override void dispose()
    {
        newRule.deleted -= newRuleDeletedEventHandler;
    }
}
...