Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ASP.NET WebApp性能问题:如何解决?_C#_Asp.net_Performance_Memory Leaks_Red Gate Ants - Fatal编程技术网

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

C# ASP.NET WebApp性能问题:如何解决?,c#,asp.net,performance,memory-leaks,red-gate-ants,C#,Asp.net,Performance,Memory Leaks,Red Gate Ants,我一直在试图找出ASP.NET Web应用程序的一些性能问题。这是一个在线应用程序,由多个用户使用(10+)。简单概述一下:该应用程序使用web表单、MVC页面、web服务等的组合。。。当多个用户连接到应用程序时,它似乎变得非常缓慢。在调查内存之后,应用程序似乎正在使用大量内存,这会减慢机器的速度,这表明未处理非托管资源。我安装了ANTS,然后在系统上捕获了一些应用程序。事实证明,非托管资源占用了大量内存: 这是我第一次分析内存。ANTS profiler指出我的一个类(规则)有大量的活动实例:

我一直在试图找出ASP.NET Web应用程序的一些性能问题。这是一个在线应用程序,由多个用户使用(10+)。简单概述一下:该应用程序使用web表单、MVC页面、web服务等的组合。。。当多个用户连接到应用程序时,它似乎变得非常缓慢。在调查内存之后,应用程序似乎正在使用大量内存,这会减慢机器的速度,这表明未处理非托管资源。我安装了ANTS,然后在系统上捕获了一些应用程序。事实证明,非托管资源占用了大量内存:

这是我第一次分析内存。ANTS profiler指出我的一个类(规则)有大量的活动实例:(GC似乎没有释放这些实例)

深入到类级别后,它会显示一条警告,指出该类未从内存中释放,这可能是因为未注销事件处理程序。现在,该类确实包含一个事件处理程序实例,那么它可能是这样的吗

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

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

嗯。。我看到eventhandler“deleted”是一个公共事件处理程序。因此,我的猜测是,首先创建Rule对象,然后为Rule.deleted分配一个eventhandler。如果是这种情况,那么正如您所怀疑的,eventhandler可能是规则对象未被垃圾收集的原因

编辑:

也许你可以试试这样:

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

嗯。。我看到eventhandler“deleted”是一个公共事件处理程序。因此,我的猜测是,首先创建Rule对象,然后为Rule.deleted分配一个eventhandler。如果是这种情况,那么正如您所怀疑的,eventhandler可能是规则对象未被垃圾收集的原因

编辑:

也许你可以试试这样:

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

什么是数据管理器?DataManager是一个密封的静态类,包含常用的数据库方法和包装器,就像上面的execute方法一样,它只是cmd.ExecuteOnQuery()的包装器;什么是数据管理器?DataManager是一个密封的静态类,包含常用的数据库方法和包装器,就像上面的execute方法一样,它只是cmd.ExecuteOnQuery()的包装器;我更新了线程。事件被分配到另一个名为Option的类中。我只是不知道什么时候以及如何取消注册这个活动。是的,我也是这么想的。我是否需要在任何时候显式地调用规则对象上的dispose方法,或者是我需要做的所有事情?我还实现了finalize方法,它在对象未被释放或对它的引用丢失时调用dispose方法。您可能不需要在规则类中执行任何操作,因为对规则类的引用产生了问题,目前我们怀疑Option是罪魁祸首。Finalize可能会有所帮助,事实上,您可以重构它以在选项本身的Finalize中取消注册事件,而不是dispose。那么,在这之后,你觉得有什么不同吗?还是我们找错人了?我更新了线索。事件被分配到另一个名为Option的类中。我只是不知道什么时候以及如何取消注册这个活动。是的,我也是这么想的。我是否需要在任何时候显式地调用规则对象上的dispose方法,或者是我需要做的所有事情?我还实现了finalize方法,它在对象未被释放或对它的引用丢失时调用dispose方法。您可能不需要在规则类中执行任何操作,因为对规则类的引用产生了问题,目前我们怀疑Option是罪魁祸首。Finalize可能会有所帮助,事实上,您可以重构它以在选项本身的Finalize中取消注册事件,而不是dispose。那么,在这之后,你觉得有什么不同吗?还是我们找错树了?