2011-04-21 152 views
1

我们正在开发餐厅自动化软件(使用VS.NET C#)。我们正在使用POS产品,其中大多数具有赛扬或原子处理器,512 MB或1GB RAM。所以在开始的时候就知道我们无法获得更强大的PC(我看到了像“让你的客户获得更好的PC”的建议:))。我的程序通过EmptyWorkingSet函数获得性能提升?危险吗?

我们有内存问题。为了表示真正的顾客的购物车,我们使用面板,我们添加自定义控件来表示产品在购物车中。这意味着大量的控件添加到面板,然后删除(Panel.controls.Clear函数。)此方法导致内存泄漏,程序性能下降。搜索和搜索后,我发现Panel.Control.Clear()funtction清除了面板中的所有控件,但不是从内存中清除。所以我禁用了面板来检查,并且wholaaa一切正常。没有内存泄漏了。所以我决定取消购物车面板以节省存货。但后来我发现了非常有用的建议,如EmptyWorkingSet。

[DllImport("psapi.dll")] 
    static extern int EmptyWorkingSet(IntPtr hwProc); 

    static void MinimizeFootprint() 
    { 
     EmptyWorkingSet(Process.GetCurrentProcess().Handle); 
    } 

然后我添加了代码,启用了购物车面板,它没有任何改变。性能还是不错的。没有内存泄漏,性能下降。但有些人说在herehere EmptyWorkingSet可能会导致页面错误,这是危险的。我正在测试程序并没有发生任何事情。它像一个魅力。所以这些是我的选择

  1. 删除导致内存问题的购物车面板。
  2. 从cartPanel清除自定义控件后,从内存中删除自定义控件(我不知道如何,但我可以弄明白)
  3. 使用EmptyWorkingSet,但它可能会导致页面错误(真的,我不知道什么是页面错误的意思)

SO你说什么

回答

1

我认为问题是,你清除的控件的集合,当你要处置他们。此外,确保在清除它们之前解除控件的任何事件处理程序,因为事件处理程序会在对象之间设置引用,所以事件的侦听器将导致符合条件的集合对象继续存在。在尝试强制清除工作集之前,我会走这条路线。

+0

我发现有关unhooking事件处理程序在这里的大文章http://www.simple-talk.com/dotnet/.net-tools/tracing-memory-leaks-in-.net-applications-with-ants-profiler /。这是处理自定义控件和解除事件的一种方式。但是太多的努力,为什么不使用EmptyWorkingSet只需2行代码。 – Murat 2011-04-21 17:31:54

+0

@穆拉特:它的好习惯是养成处理实现IDisposable的对象的习惯。在这种情况下,你正在做的事情可能会奏效(我怀疑这一点),但将来它可能不会。最好不要搞乱.Net垃圾收集和IDisposable是如何工作的。你所做的只是一种黑客攻击,并且总是会导致你的问题。 – Andy 2011-04-21 22:17:12