我有一个可以最小化到系统托盘的WinForms应用程序(我使用的是VB)。我使用了在利用NotifyIcon和Form_Resize事件的多篇文章中描述的"hackish“方法。
这一切在美学上都工作得很好,但所使用的资源和内存不受影响。我希望在最小化到系统托盘时能够最小化资源,就像Visual Studio所做的那样。如果你是在Visual Studio中编码,内存使用量可能会上升(取决于项目大小)到500MB以上,但当将Visual Studio最小化到任务栏时,内存会急剧减少到(我假设的)最小值。
有没有人知道如何做到这一点?
下面是这个应用程序的简短描述,如果有人觉得它相关的话:我有一个windows表单,其中包含一个ListView,其中包含我的it部门的工作订单。应用程序有一个"listener“,它在新的工作指令提交时发出通知。因此,当应用程序在系统托盘中运行时,我真正要做的就是每隔几分钟将ListView中的项目计数与SQL表中的行数进行比较。
编辑:更具体地说,windows窗体本质上具有通过控件使用的线程和资源,当窗体不可见(在系统托盘中)时,这些资源仍在使用中。除了取消所有控件并在恢复窗体时重新绘制它们之外,我还能做些什么来最小化这些资源。
发布于 2008-11-04 13:14:56
调用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);
发布于 2008-11-04 12:23:25
您可能正在寻找这个函数调用:SetProcessWorkingSetSize
如果您使用-1作为参数执行SetProcessWorkingSetSize接口调用,那么Windows将立即裁剪工作集。
但是,如果大部分内存仍由您尚未释放的资源占用,则最小化工作集将不起任何作用。这与强制垃圾收集的建议相结合可能是您最好的选择。
从您的应用程序描述中,您可能还想验证ListView占用了多少内存以及数据库访问对象。我也不清楚您是如何进行这些监控数据库调用的。您可能希望将其隔离到一个单独的对象中,并避免在最小化时接触任何窗体,否则程序将被迫保持控件的加载和可访问。您可以启动一个单独的线程进行监视,并将ListView.Count作为参数传递。
以下是一些来源:
发布于 2008-11-04 12:09:33
要清理未使用的内存,请使用GC.Collect()...尽管你应该读一读为什么要这样做,以及为什么经常使用它通常是一个坏主意。
如果你指的是其他资源,你需要更具体。
https://stackoverflow.com/questions/263234
复制