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

标签 c# winforms memory

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

这一切都运行良好。然而,我注意到有些奇怪的事情。当程序首次启动时,任务管理器中的内存使用情况显示〜14000 K。如果我然后从系统托盘打开表单,它会上升到〜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();
}

感谢您的帮助。

最佳答案

内存中的假“下降”是因为在最小化事件期间,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 应用程序最小化/恢复对于用户来说几乎感觉不到,但可以最小化托管内存虚拟机中的 RAM 累积。我非常怀疑这是否是“最佳实践”,但它让管理层中的数字专家感到高兴。

关于c# - 启动隐藏的 Windows 窗体应用程序 - 高内存使用率?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12183423/

相关文章:

multithreading - TLS 和 PGAS 之间有什么区别?

c# - 如何将 VS 命令提示符添加到 Visual Studio 2010 C# Express?

c# - 如何使用互斥锁

c# - 显示多个表单

c# - 如何使用 BasicEffect 在 XNA 中绘制模型

c# - 我们如何在winform中的datagridview中进行分页

c# - 如何确保嵌入式浏览器控件使用 Internet Explorer 9?

php - 需要算法或 MySQL 查询建议

java - 当对象数量超过 `int` 所能容纳的数量时,身份哈希码会发生什么情况?

c# 从 System.Data.DataRowView 转换为字符串