Joe*_*oey 8 .net c# vb.net visual-studio winforms
我有一个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);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2796 次 |
| 最近记录: |