当前位置:  开发笔记 > 编程语言 > 正文

.NET最小化到托盘并最小化所需的资源

如何解决《.NET最小化到托盘并最小化所需的资源》经验,为你挑选了1个好方法。

我有一个WinForms应用程序(我正在使用VB),可以最小化到系统托盘.我使用了NotifyIcon并使用Form_Resize事件在多个帖子中描述的"hackish"方法.

这一切都在美学上很好,但使用的资源和内存不受影响.我希望能够在最小化到系统托盘时最小化资源,就像Visual Studio一样.如果您在Visual Studio中编码,内存使用量可能会上升(取决于项目大小)超过500 MB,但是当将Visual Studio最小化到任务栏时,内存会大幅减少到(我假设的)是最小量.

有没有人知道如何做到这一点?

以下是应用程序的简短描述,如果有人发现它相关:我有一个带有ListView的窗体,其中包含我的IT部门的工作订单.该应用程序有一个"监听器",通知何时提交新的工作订单.因此,当应用程序在系统托盘中运行时,我真正做的就是每隔几分钟将ListView中的项目数与SQL表中的行数进行比较.

编辑:更具体地说,Windows窗体本质上具有通过控件使用的线程和资源,当窗体不可见时(在系统托盘中)这些资源仍在使用中.我可以做些什么来最小化这些资源,除了杀死所有控件并在表单恢复时重绘它们.



1> Jesse C. Sli..:

调用MiniMizeMemory()将执行垃圾收集,修剪进程的工作大小,然后压缩进程的堆.

public static void MinimizeMemory()
{
    GC.Collect(GC.MaxGeneration);
    GC.WaitForPendingFinalizers();
    SetProcessWorkingSetSize(
        Process.GetCurrentProcess().Handle,
        (UIntPtr)0xFFFFFFFF,
        (UIntPtr)0xFFFFFFFF);

    IntPtr heap = GetProcessHeap();

    if (HeapLock(heap))
    {
        try
        {
            if (HeapCompact(heap, 0) == 0)
            {
                // error condition ignored
            }
        }
        finally
        {
            HeapUnlock(heap);
        }
    }
}

[DllImport("kernel32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
internal static extern bool SetProcessWorkingSetSize(
    IntPtr process,
    UIntPtr minimumWorkingSetSize,
    UIntPtr maximumWorkingSetSize);

[DllImport("kernel32.dll", SetLastError = true)]
internal static extern IntPtr GetProcessHeap();

[DllImport("kernel32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
internal static extern bool HeapLock(IntPtr heap);

[DllImport("kernel32.dll")]
internal static extern uint HeapCompact(IntPtr heap, uint flags);

[DllImport("kernel32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
internal static extern bool HeapUnlock(IntPtr heap);

推荐阅读
放ch养奶牛
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有