通知图标上下文菜单速度变慢

本文关键字:速度 菜单 图标 上下文 通知 | 更新日期: 2023-09-27 18:36:02

因此,我有一个[.NET]程序,该程序实现了一个NotifyIcon,该程序在程序运行的整个过程中都保留在Windows的通知托盘中。当我第一次执行程序时,以及之后的一小段时间,NotifyIcon 和相关的 ContextMenuStrip 工作绝对是魅力。

但是,在

计算机处于低功耗状态或仅空闲几个小时后,在尝试访问上下文菜单时,绘制对象最多可能需要 2 秒。

是否需要定义一些持久性才能使菜单更快地响应?我是否启用了触发资源清理的错误事件?

编辑

似乎我有 3 个选项可以看看我是否可以让它工作:
1.将SecureString对象插入ContextMenuStrip对象;这假设通过将SecureString放在ContextMenuStrip内,整个对象将被视为相同,并且不会被页面交换
2. 创建一个以某种方式按间隔接触ContextMenuStripTimer,以将其保存在内存
中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[一想到就洗澡]

再次感谢那些参与这个问题并帮助进一步思考以找到解决方案的人。