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

问题描述:

我正在添加按钮来形成循环,我注意到添加单击事件处理程序太慢减慢应用程序。后来我尝试点击鼠标事件,而不是点击事件,它立即工作。为什么Winforms Click事件比MouseClick事件慢?

这张截图显示我的测试结果: alt text 的源代码:http://pastebin.com/qVewNm1u

结果1000事件处理程序:
点击:2892ms 鼠标点击:1毫秒

我想不通为什么点击事件非常慢。

编辑: 如果我改变建立平台的目标到x64或任何CPU,结果发生变化: 点击:5,鼠标点击:9 看起来像x86平台的目标造成这个问题,但还是64位的结果也不好太相比,x86的鼠标点击时间(1ms)。

编辑2: 我改变了截图现在它会显示更好的结果。

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

我是repro,但它特定于VS2010。在VS2008中没有这样的行为,两者都在小于1的时间内执行。它也不依赖于.NET版本。

这看起来像IntelliTrace中的缺陷,可在Ultimate版本中找到。试图深入挖掘并转向非托管代码调试,以消除该效应。项目+属性,调试选项卡,勾选“启用非托管代码调试”。另外,在没有调试器的情况下运行程序(Ctrl + F5)可以消除该效应。扣篮是Tools + Options,IntelliTrace,General,取消勾选以移除效果。

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

如上所述,解决方法是禁用IntelliTrace。这保证不会成为客户机器上的问题。

+0

现在每次结果0ms后禁用IntelliTrace。感谢帮助。我会在connect.microsoft.com上发布bug报告 – Jaex 2010-09-11 14:12:59

+0

优秀的侦探工作,Hans! – Robaticus 2010-09-11 15:49:56

你试过先创建按钮,测量事件处理附件之前?

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

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

+0

我能够复制他的结果。第一次我得到4000+毫秒,第二次得到1毫秒。 – Robaticus 2010-09-11 03:13:44

+0

在我的真实项目中,我首先创建了按钮,并且只点击事件处理程序订阅非常慢。它给每一次相同的结果。现在我试图构建x64和结果非常有趣:点击:3 MouseClick:25 看起来像x84构建造成这个问题,在我的w7 64位操作系统。 – Jaex 2010-09-11 03:31:12

虽然我不能告诉你发生了什么,但测试套件中存在一些问题。

首先,您应该在执行Console.WriteLine之前停止计时器,因为您现在还在测量创建WriteLine中使用的字符串需要多长时间。其次,您可能想在启动计时器之前创建按钮,因为您还在测量按钮创建时间,其中包括堆栈,堆,垃圾回收以及其他潜在问题。我建议将按钮分配给一个数组,然后在启动秒表后将偶数处理程序分配给这些项目。

+0

'ElapsedMilliseconds'将在任何控制台的东西发生之前被调用。 – leppie 2010-09-11 03:43:46

+0

我没有说过。重读我说的话。 – 2010-09-11 03:45:21

+0

同样的结果:http://img841.imageshack.us/img841/9932/ss20100911064602.png – Jaex 2010-09-11 03:47:40

我不确定,因为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),这在每个迭代上创建新的委托实例。

+0

这解决了我的问题,为x64构建,现在它是0毫秒,但没有改变的x86构建它仍然是2900毫秒。什么是您的构建平台?因为只有在构建平台为x64时才会出现此问题。需要64位操作系统进行测试。 – Jaex 2010-09-11 05:28:38

+0

我忘了提及4ms时间只发生在x86机器上。 x64和任何APU构建的结果始终为0ms。我正在运行Windows 7 x64,Visual Studio 2008和.Net Framework 3.5 SP1。 – tia 2010-09-11 05:39:31