2

これが私の状況です。起動時に起動し、使用していないときにシステムトレイで最小化されて実行される小さなWindowsフォームを作成しています。ユーザーはシステムトレイの通知アイコンを介してフォームを開き、フォームを送信した後、アプリは最小化してシステムトレイに戻ります。

これはすべて正常に機能します。しかし、少し奇妙なことに気づきました。プログラムを最初に起動すると、タスクマネージャーのメモリ使用量は約14000 Kと表示されます。次に、システムトレイからフォームを開くと、最大16000 Kになります。その後、フォームを最小化してシステムトレイに戻します。使用量は1000K未満に低下します。これは良好です。アプリケーションを起動して、使用量が時間の経過とともに低下するかどうかを確認するのを待っていますが、変化は見られませんでした。

これが気になるのは、アプリケーションが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();
}

ご協力ありがとうございました。

4

1 に答える 1

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の発生を最小限に抑えます。これが「ベストプラクティス」であるとは非常に疑わしいですが、それは経営陣の数字を喜ばせます。

于 2012-08-29T17:41:28.737 に答える