为什么Winforms Click事件比MouseClick事件慢?
我正在添加按钮来形成循环,我注意到添加单击事件处理程序太慢减慢应用程序。后来我尝试点击鼠标事件,而不是点击事件,它立即工作。为什么Winforms Click事件比MouseClick事件慢?
这张截图显示我的测试结果: 的源代码:http://pastebin.com/qVewNm1u
结果1000事件处理程序:
点击:2892ms 鼠标点击:1毫秒
我想不通为什么点击事件非常慢。
编辑: 如果我改变建立平台的目标到x64或任何CPU,结果发生变化: 点击:5,鼠标点击:9 看起来像x86平台的目标造成这个问题,但还是64位的结果也不好太相比,x86的鼠标点击时间(1ms)。
编辑2: 我改变了截图现在它会显示更好的结果。
我是repro,但它特定于VS2010。在VS2008中没有这样的行为,两者都在小于1的时间内执行。它也不依赖于.NET版本。
这看起来像IntelliTrace中的缺陷,可在Ultimate版本中找到。试图深入挖掘并转向非托管代码调试,以消除该效应。项目+属性,调试选项卡,勾选“启用非托管代码调试”。另外,在没有调试器的情况下运行程序(Ctrl + F5)可以消除该效应。扣篮是Tools + Options,IntelliTrace,General,取消勾选以移除效果。
我建议您将您的发现发布到connect.microsoft.com。您可以在您的反馈报告中引用此主题。他们需要知道的诊断问题的一切都可用。
如上所述,解决方法是禁用IntelliTrace。这保证不会成为客户机器上的问题。
你试过先创建按钮,测量事件处理附件之前?
这里至少有两个未知数:1)按钮构造函数的执行时间,以及2)事件处理程序订阅。
更新:我试图重现这个问题,但我一直得到4ms-6ms的两个测试。一个测试总是慢一点,还是只发生一次?有时奇怪的事情发生与jitting和GCing并不总是100%确定性。
虽然我不能告诉你发生了什么,但测试套件中存在一些问题。
首先,您应该在执行Console.WriteLine之前停止计时器,因为您现在还在测量创建WriteLine中使用的字符串需要多长时间。其次,您可能想在启动计时器之前创建按钮,因为您还在测量按钮创建时间,其中包括堆栈,堆,垃圾回收以及其他潜在问题。我建议将按钮分配给一个数组,然后在启动秒表后将偶数处理程序分配给这些项目。
我不确定,因为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)
,这在每个迭代上创建新的委托实例。
现在每次结果0ms后禁用IntelliTrace。感谢帮助。我会在connect.microsoft.com上发布bug报告 – Jaex 2010-09-11 14:12:59
优秀的侦探工作,Hans! – Robaticus 2010-09-11 15:49:56