【问题标题】:Starting up a Windows Form Application hidden - High Memory Usage?启动 Windows 窗体应用程序隐藏 - 高内存使用?
【发布时间】:2012-08-24 09:17:45
【问题描述】:

这是我的情况。我正在构建一个小型 Windows 窗体,它将在启动时启动并在不使用时在系统托盘中最小化运行。用户将通过系统托盘中的通知图标打开表单,提交表单后,应用程序将最小化回系统托盘。

这一切都很好。然而,我注意到了一些奇怪的事情。当程序首次启动时,任务管理器中的 Mem Usage 显示 ~14000 K。如果我从系统托盘打开表单,它会上升到 ~16000 K。如果我然后将表单最小化回系统托盘,使用率降至

我担心这个的原因是因为应用程序将在 Citrix 环境中运行,所以我想在应用程序不使用时降低每个实例的内存使用量,但我宁愿不必这样做让用户每天早上登录时打开应用程序并将其最小化。

如果有人有任何建议或提示,我将不胜感激。我将包括下面的主要代码块。

public Form1()
{
    InitializeComponent();
    WindowState = FormWindowState.Minimized;
    notifyIcon1.DoubleClick += new EventHandler(notifyIcon1_DoubleClick);
    Rectangle r = Screen.PrimaryScreen.WorkingArea;
    this.StartPosition = FormStartPosition.Manual;
    this.Location = new Point(Screen.PrimaryScreen.WorkingArea.Width - this.Width, Screen.PrimaryScreen.WorkingArea.Height - this.Height);
    currentWorkstation = Environment.GetEnvironmentVariable("clientname");
    if (currentWorkstation == null)
        currentWorkstation = Environment.MachineName;
    GC.KeepAlive(notifyIcon1);
    GC.KeepAlive(currentWorkstation);
}

private void Form1_Resize(object sender, EventArgs e)
{
    if (WindowState == FormWindowState.Minimized)
       Hide();
}

感谢您的帮助。

【问题讨论】:

    标签: c# winforms memory


    【解决方案1】:

    内存中的虚假“下降”是因为在最小化事件期间,Windows 将大部分应用程序内存转移到虚拟内存。在您的启动过程中,您可能永远不会真正关闭表单/最小化应用程序,因此永远不会进行清理。

    更多信息可以在这里看到:

    https://micksmix.wordpress.com/2010/01/08/why-does-task-manager-show-an-applications-memory-usage-drop-after-minimizing-it-to-the-the-taskbar/

    我对此的了解仅来自于将其用作诱使 J++ GC 运行的一种方式。告诉 Windows 应用程序最小化/恢复对用户来说几乎是察觉不到的,但可以最小化托管内存 VM 中的 RAM 累积。我非常怀疑这是“最佳实践”,但它让管理部门的数字人士感到高兴。

    【讨论】:

    • 感谢您的链接。我认为这与 Windows 如何处理最小化事件有关。我添加了WindowState = FormWindowState.Normal;WindowState = FormWindowState.Minimized;,现在使用率在启动时约为 2000 K。正如您所说,可能不是“最佳实践”,但会让数字人士感到高兴。谢谢。
    • 技术术语是“修剪工作集”,它不是清理。它只发生在旧版本的 Windows 上,这不再在 Win7 和 Win8 上完成。 RAM 使用测量通常没有用,Windows 会在需要为其他进程腾出空间时取消映射页面。
    • @HansPassant 感谢您的澄清。但就我自己的教育而言,框架是否可以(并且确实/曾经)挂钩“trim”事件并强制执行 GC 事件?
    • 不,Windows 不会为此生成任何通知。 GC 只管理虚拟内存。
    猜你喜欢
    • 2014-08-17
    • 1970-01-01
    • 2011-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-02
    相关资源
    最近更新 更多