【问题标题】:My Program get performance boost with EmptyWorkingSet function? Is it dangerous?我的程序通过 EmptyWorkingSet 函数获得性能提升?危险吗?
【发布时间】:2011-08-10 11:45:50
【问题描述】:

我们正在开发餐厅自动化软件(使用 VS.NET C#)。我们正在使用 POS 产品,其中大多数产品都有 celeron 或 atom 处理器,上面有 512 mb 或 1gb ram。所以一开始就知道我们无法获得更强大的 PC(我看到了“为您的客户提供更好的 PC”这样的建议:))。

我们有一个内存问题。为了表示真实客户的购物车,我们使用面板,我们添加自定义控件来表示购物车中的产品。这意味着许多控件被添加到面板,然后删除(Panel.controls.Clear 函数。)这种方法会导致内存泄漏并且程序性能降低。在搜索和谷歌搜索后,我发现 Panel.Control.Clear() 函数清除了面板中的所有控件,但没有从内存中清除。所以我禁用了面板进行检查,并且一切正常。没有内存泄漏了。所以我决定移除那个购物车面板以节省记忆。但后来我在这里发现了非常有用的建议,比如 EmptyWorkingSet。

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

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

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

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

那你说什么

【问题讨论】:

    标签: c# visual-studio performance


    【解决方案1】:

    我认为问题在于您正在清除控件集合,而您应该在处理它们时。此外,请确保在清除控件之前将任何事件处理程序与控件脱钩,因为事件处理程序会在对象之间设置引用,因此事件的侦听器将导致原本符合收集条件的对象保留下来。在尝试强制清除工作集之前,我会走那条路。

    【讨论】:

    • 我在这里simple-talk.com/dotnet/.net-tools/… 找到了关于取消挂钩事件处理程序的精彩文章。这是一种处理自定义控件和取消挂钩事件的方法。但是太费劲了,为什么不使用 EmptyWorkingSet 只需 2 行代码。
    • @Murat:养成处理实现 IDisposable 的对象的习惯是一种很好的做法。在这种情况下,您正在做的事情可能会奏效(我对此表示怀疑),但将来可能不会。最好不要搞乱 .Net 垃圾收集和 IDisposable 的工作方式。你正在做的是一种黑客行为,并且总是会给你带来麻烦。
    猜你喜欢
    • 1970-01-01
    • 2011-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-28
    • 1970-01-01
    • 2011-07-17
    相关资源
    最近更新 更多