我有一个WinForms应用程序(我正在使用VB),可以最小化到系统托盘.我使用了NotifyIcon并使用Form_Resize事件在多个帖子中描述的"hackish"方法.
这一切都在美学上很好,但使用的资源和内存不受影响.我希望能够在最小化到系统托盘时最小化资源,就像Visual Studio一样.如果您在Visual Studio中编码,内存使用量可能会上升(取决于项目大小)超过500 MB,但是当将Visual Studio最小化到任务栏时,内存会大幅减少到(我假设的)是最小量.
有没有人知道如何做到这一点?
以下是应用程序的简短描述,如果有人发现它相关:我有一个带有ListView的窗体,其中包含我的IT部门的工作订单.该应用程序有一个"监听器",通知何时提交新的工作订单.因此,当应用程序在系统托盘中运行时,我真正做的就是每隔几分钟将ListView中的项目数与SQL表中的行数进行比较.
编辑:更具体地说,Windows窗体本质上具有通过控件使用的线程和资源,当窗体不可见时(在系统托盘中)这些资源仍在使用中.我可以做些什么来最小化这些资源,除了杀死所有控件并在表单恢复时重绘它们.
调用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);