启动隐藏的Windows窗体应用程序 - 高内存使用率?

时间:2012-08-29 17:29:27

标签: c# winforms memory

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

一切正常。但是,我发现有些奇怪的东西。当程序首次启动时,任务管理器中的Mem Usage显示~14000 K.如果我从系统托盘中打开Form,它会启动~16000 K.如果我然后将表单最小化回系统托盘,使用量下降到< 1000 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();
}

感谢您的帮助。

1 个答案:

答案 0 :(得分:4)

内存中的假“丢弃”是因为在最小化事件期间,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应计。我非常怀疑这是“最佳实践”,但它使管理层中的数字人员感到高兴。