我们正在为餐馆开发自动化软件(使用VS.NET C#)。我们正在使用POS产品,其中大多数都有celeron或原子处理器,上面有512 mb或1gb ram。所以在开始时就知道我们无法获得更强大的PC(我看到像“为客户提供更好的PC”这样的建议:))。
我们有记忆问题。为了代表真实客户的购物车,我们使用面板,我们添加自定义控件来代表购物车中的产品。这意味着很多控件都添加到面板,然后删除(Panel.controls.Clear函数。)此方法导致内存泄漏,程序性能下降。搜索和谷歌搜索后,我发现Panel.Control.Clear()函数清除面板中的所有控件,但不清除内存中的控件。所以我禁用了面板来检查,并且wholaaa一切正常。没有内存泄漏了。所以我决定删除那个购物车面板来保存记忆。但后来我在这里找到了非常有用的建议,比如EmptyWorkingSet。
[DllImport("psapi.dll")]
static extern int EmptyWorkingSet(IntPtr hwProc);
static void MinimizeFootprint()
{
EmptyWorkingSet(Process.GetCurrentProcess().Handle);
}
然后我添加了代码,启用了购物车面板,它没有任何改变。性能仍然很好。没有内存泄漏,没有性能下降。但有些人在here和here中说,EmptyWorkingSet可能会导致Page Faults,这很危险。我正在测试程序,什么也没发生。它就像一个魅力。所以这些是我的选择
你说什么
答案 0 :(得分:1)
我认为问题在于,当您应该处理它们时,您正在清除控件集合。此外,请确保在清除控件之前解除对控件的任何事件处理程序,因为事件处理程序会在对象之间设置引用,因此事件的侦听器将导致其他符合条件的集合对象。在尝试强制清除工作集之前,我会走那条路。