为什么Winforms Click事件比MouseClick事件慢?

时间:2010-09-11 02:35:18

标签: c# .net winforms events click

我正在添加按钮以形成循环,我注意到添加了点击事件处理程序,减慢了应用程序的速度。后来我尝试了鼠标点击事件而不是单击事件,它立即工作。

此屏幕截图显示了我的测试结果: alt text 源代码:http://pastebin.com/qVewNm1u

1000事件处理程序的结果:
点击:2892ms MouseClick:1ms

我无法弄清楚为什么Click事件很慢。

编辑: 如果我将构建平台目标更改为x64或任何CPU,结果将更改: 单击:5,MouseClick:9 看起来像x86平台目标导致了这个问题,但与x86 MouseClick时间(1ms)相比,x64结果仍然不太好。

EDIT2: 我改变了截图,现在它会显示更好的结果。

EDIT3: https://connect.microsoft.com/VisualStudio/feedback/details/597039/winforms-click-event-slower-than-the-mouseclick-event

4 个答案:

答案 0 :(得分:5)

我责备,但它特定于VS2010。 VS2008中没有这样的行为,两者都执行少于1次。它也不依赖于.NET版本。

这看起来像UltimateTrace中的IntelliTrace中的缺陷。尝试深入挖掘并转换非托管代码调试,删除了效果。 Project + Properties,Debug选项卡,勾选“启用非托管代码调试”。此外,在没有调试器(Ctrl + F5)的情况下运行程序会删除效果。扣篮是工具+选项,IntelliTrace,常规,解开启用以删除效果。

我建议您将您的发现发布到connect.microsoft.com。您可以在反馈报告中引用此主题。他们需要了解诊断问题所需的一切。

如上所述,解决方法是禁用IntelliTrace。这可以保证在您客户的机器上不会出现问题。

答案 1 :(得分:0)

在测量事件处理程序附件之前,您是否尝试先创建按钮?

这里至少有两个未知数:1)按钮构造函数执行时间,以及2)事件处理程序订阅。

更新:我试图重现这个问题,但我一直在两次测试中获得4ms-6ms。一次测试总是慢一点,还是只发生一次?有时奇怪的事情发生在jitting和GCing上并不总是100%确定性。

答案 2 :(得分:0)

虽然我无法告诉您发生了什么,但您的测试套件存在许多问题。

首先,您应该在执行Console.WriteLine之前停止计时器,因为您现在还要测量创建WriteLine中使用的字符串所需的时间。

其次,您可能希望在启动计时器之前创建按钮,因为您还要测量按钮创建时间,包括堆栈,堆,垃圾回收和其他潜在问题。我建议将按钮分配给一个数组,然后在启动秒表后为这些项目指定偶数处理程序。

答案 3 :(得分:0)

我不确定因为我的ClickTest()只有4ms。但是,我已将代码更改为此,4ms时间消失了。

EventHandler d = new EventHandler(Form1_Click);
for (int i = 0; i < buttons.Length; i++) buttons[i].Click += d;

您编写的循环中的代码等同于button[i].Click += new EventHander(Form_Click),它在每次迭代时都会创建新的委托实例。