NotifyIcon上下文菜单减慢速度

时间:2013-10-20 06:17:41

标签: c# .net performance notifyicon contextmenustrip

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

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

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

修改

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

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

感谢到目前为止的回复!

1 个答案:

答案 0 :(得分:0)

从我的测试中可以看出,问题编辑中概述的选项1已经完成了大部分工作......

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

遗憾的是,这种方法有两个主要的注意事项:
1。 如果机器RAM被点击 HARD SecureString对象将被强制丢弃或与包含对象分离执行页面错误/交换。我不确定它是否会在情景后再次重新组合在一起,但似乎没有问题 2。 如果机器处于睡眠状态或休眠状态,整个应用程序都会换页,SecureString绝对会被丢弃。为了帮助解决这些问题,我有SessionSwitchEventHandler检测机器是否已解锁并在菜单项“new SecureString()属性中创建Tag对象并重新关联{{1}对象ContextMenuStrip

虽然它不是最好的解决方案,但它确实有效,并且比创建一个触摸菜单[shudders]的计时器更好,或者更糟糕的是,玩NotifyIcon.ContextMenuStrip [在想法中洗澡]

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