ASP.. NET WebApp性能问题:如何解决



我一直在试图找出一些性能问题与我们的ASP。NET Web应用程序。它是一个在线应用程序,由多个用户(10+)使用。只是一个快速的概述:该应用程序使用了web表单,MVC页面,web服务等的组合…当多个用户连接到应用程序时,它似乎变得非常慢。在调查内存之后,似乎应用程序正在使用大量内存,并且正在减慢机器的速度,这表明未处理的非托管资源。我安装了ANTS,然后在系统上捕获了一些应用程序。很多内存被非托管资源使用了:http://tinypic.com/r/154ujra/7

这是我第一次分析内存。ANTS分析器指出我的一个类(RULE)有大量的活动实例:http://tinypic.com/r/1264ltu/7(似乎没有被GC释放)

在深入到类级别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);
    }
    ............................
 }

嗯…我看到事件处理程序'deleted'是一个公共的。所以我的猜测是,首先创建Rule对象,然后为Rule.deleted分配一个事件处理程序。如果是这种情况,那么正如您所怀疑的那样,事件处理程序可能是导致Rule对象没有被垃圾收集的原因。

编辑:

也许你可以试试这样做:

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;
    }
}

相关内容

  • 没有找到相关文章

最新更新