0

所以,我有一个 [.NET] 程序,它实现了一个 NotifyIcon,它在程序运行的整个过程中都存在于 Windows 的通知托盘中。当我第一次执行程序时,以及之后的一小段时间,NotifyIcon 和相关的 ContextMenuStrip 发挥了绝对的魅力。

但是,在机器处于较低功率状态或闲置几个小时后,尝试访问上下文菜单时,对象可能需要长达 2 秒的时间才能绘制。

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

编辑

看起来我有 3 个选项来看看我是否可以让它工作:
1. 将一个SecureString对象插入到ContextMenuStrip对象中;这假设通过在SecureString内部ContextMenuStrip,整个对象将被视为相同并且不会被页面交换
2. 创建一个以某种方式Timer触及ContextMenuStripon 间隔以将其保留在内存中
3. 更改Process.MinWorkingSet应用程序何时完成初始启动尝试(阅读:希望)ContextMenuStrip对象保持活动状态而不是其他东西

我真的不喜欢第 2 项或第 3 项;3 特别。我将尝试第 1 项,看看它是否有效。

感谢您迄今为止的回复!

4

1 回答 1

0

从我的测试来看,问题编辑中概述的选项1似乎已经完成了这个技巧......在大多数情况下。

如前所述,并且我已经理解,C# 是一种托管语言;使内存管理变得困难。
但是,通过将new SecureString()对象添加到ContextMenuStrip菜单项的Tag属性之一,菜单对象将保留在 RAM 中。

遗憾的是,这种方法有两个主要警告:
1.如果机器 RAM 被击中HARD,则该SecureString对象要么被强制丢弃,要么与包含的对象分离,并执行页面错误/交换。我不确定它是否在场景后再次重新耦合在一起,但它似乎还可以。
2.如果机器进入睡眠或休眠状态,整个应用程序会被页面交换,并且SecureString肯定会被丢弃。为了帮助解决这些情况,我有一个SessionSwitchEventHandler检测机器是否已解锁并new SecureString()在菜单项的Tag属性中创建一个对象并将该对象重新关联ContextMenuStripNotifyIcon.ContextMenuStrip

虽然这不是最好的解决方案,但它确实有效,并且比创建一个触摸菜单的计时器更好[颤抖],或者更糟糕的是,玩Process.MinWorkerSet[想着洗澡]

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

于 2013-10-26T02:54:44.363 回答