首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >.NET最小化到托盘和最小化所需资源

.NET最小化到托盘和最小化所需资源
EN

Stack Overflow用户
提问于 2008-11-04 20:01:18
回答 4查看 2.9K关注 0票数 8

我有一个可以最小化到系统托盘的WinForms应用程序(我使用的是VB)。我使用了在利用NotifyIcon和Form_Resize事件的多篇文章中描述的"hackish“方法。

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

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

下面是这个应用程序的简短描述,如果有人觉得它相关的话:我有一个windows表单,其中包含一个ListView,其中包含我的it部门的工作订单。应用程序有一个"listener“,它在新的工作指令提交时发出通知。因此,当应用程序在系统托盘中运行时,我真正要做的就是每隔几分钟将ListView中的项目计数与SQL表中的行数进行比较。

编辑:更具体地说,windows窗体本质上具有通过控件使用的线程和资源,当窗体不可见(在系统托盘中)时,这些资源仍在使用中。除了取消所有控件并在恢复窗体时重新绘制它们之外,我还能做些什么来最小化这些资源。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2008-11-04 21:14:56

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

代码语言:javascript
代码运行次数:0
运行
复制
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);
票数 8
EN

Stack Overflow用户

发布于 2008-11-04 20:23:25

您可能正在寻找这个函数调用:SetProcessWorkingSetSize

如果您使用-1作为参数执行SetProcessWorkingSetSize接口调用,那么Windows将立即裁剪工作集。

但是,如果大部分内存仍由您尚未释放的资源占用,则最小化工作集将不起任何作用。这与强制垃圾收集的建议相结合可能是您最好的选择。

从您的应用程序描述中,您可能还想验证ListView占用了多少内存以及数据库访问对象。我也不清楚您是如何进行这些监控数据库调用的。您可能希望将其隔离到一个单独的对象中,并避免在最小化时接触任何窗体,否则程序将被迫保持控件的加载和可访问。您可以启动一个单独的线程进行监视,并将ListView.Count作为参数传递。

以下是一些来源:

.NET Applications and the Working Set

How much memory does my .Net Application use?

票数 3
EN

Stack Overflow用户

发布于 2008-11-04 20:09:33

要清理未使用的内存,请使用GC.Collect()...尽管你应该读一读为什么要这样做,以及为什么经常使用它通常是一个坏主意。

如果你指的是其他资源,你需要更具体。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/263234

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档