通知图标上下文菜单速度变慢
本文关键字:速度 菜单 图标 上下文 通知 | 更新日期: 2023-09-27 18:36:02
因此,我有一个[.NET]程序,该程序实现了一个NotifyIcon,该程序在程序运行的整个过程中都保留在Windows的通知托盘中。当我第一次执行程序时,以及之后的一小段时间,NotifyIcon 和相关的 ContextMenuStrip 工作绝对是魅力。
但是,在计算机处于低功耗状态或仅空闲几个小时后,在尝试访问上下文菜单时,绘制对象最多可能需要 2 秒。
是否需要定义一些持久性才能使菜单更快地响应?我是否启用了触发资源清理的错误事件?
编辑
似乎我有 3 个选项可以看看我是否可以让它工作:
1.将SecureString
对象插入ContextMenuStrip
对象;这假设通过将SecureString
放在ContextMenuStrip
内,整个对象将被视为相同,并且不会被页面交换
2. 创建一个以某种方式按间隔接触ContextMenuStrip
的Timer
,以将其保存在内存
中3. 当应用程序完成初始启动时更改Process.MinWorkingSet
以尝试(阅读:希望)ContextMenuStrip
对象保持活动状态而不是其他对象
我真的不喜欢第2项或第3项;尤其是第3项。我将尝试第 1 项,看看它是否有效。
感谢您到目前为止的回复!
从我的测试来看,问题编辑中概述的选项 1 似乎已经完成了这个技巧......在大多数情况下。
如前所述,我已经理解了,C#是一种托管语言;使内存管理变得困难。
但是,通过将 new SecureString()
对象添加到ContextMenuStrip
菜单项的 Tag
属性之一,菜单对象将保留在 RAM 中。
可悲的是,这种方法有两个主要警告:
1. 如果机器 RAM 受到重创,则SecureString
对象将被强制丢弃或与包含对象分离,并执行页面错误/交换。我不确定它是否会在场景后再次重新耦合在一起,但它似乎做得很好。
2.如果机器进入睡眠或休眠状态,整个应用程序将被交换页面,并且SecureString
肯定会被丢弃。为了帮助这些情况,我有一个SessionSwitchEventHandler
来检测机器是否已解锁,并在菜单项的Tag
属性中创建new SecureString()
对象,并将ContextMenuStrip
对象重新关联到NotifyIcon.ContextMenuStrip
虽然这不是最好的解决方案,但它确实有效,并且比创建一个计时器来触摸菜单[颤抖]更好,或者更糟糕的是,玩Process.MinWorkerSet
[一想到就洗澡]
再次感谢那些参与这个问题并帮助进一步思考以找到解决方案的人。