2013-12-11 198 views
2

我们有一个C#WinForms应用程序非常慢,并且通常消耗50%的CPU时间。WinForms应用程序分析

通过使用DotTrace,我们发现最耗时的工作是在UI线程上。 特别是,System.Windows.Forms.DataGridView.WndProc(消息&)消耗大部分时间。

我知道程序在DataGridView控件上调用Invoke或BeginInvoke。这相当于向DataGridView控件发送消息。但是,在调用线程上发送这些消息的时间非常短,大​​部分时间都花在UI线程上来处理这些消息。

因此,dotTrace可以发现最耗时的工作是在UI线程上,但它无法确定哪些线程发出这些消息。

那么我能做些什么来找到这些线程?

+2

“我们有一个非常慢的C#Winform应用程序,它通常假定CPU时间为50%。” - 真的?如果速度真的很慢,我预计峰值会比这更高......你有没有发生某种“UI更新风暴”?我的意思是,UI更新触发其他更新和级联... –

+0

@MitchWheat是的,我用Windows任务管理器来监视程序。 CPU使用率一直在50%左右。实际上,该计划是一个交易平台。它不断接收来自外部的报价信息,订单状态信息等,进行一些计算并更新UI。我们正在编写一个自动交易的准则,所以它每秒发出大约100个订单。我们发现它无法快速处理所有传入消息。所以我们需要找出什么是瓶颈。如果是UI,我们需要找出导致UI更新的原因,并可能会降低更新频率。 – rmm2014

+0

您可能在DataGridVew中有一个事件,它具有很长的进程和/或触发多次或可能无休止地激活,例如单元值更改或添加行时。 – Jade

回答

0

首先,对于Windows应用程序,预计wndproc将是最耗时和最耗时的方法。它是处理所有事情的应用程序的核心。当你用鼠标悬停在一个控件上时,它的wndproc处理程序将被调用几乎每个鼠标穿过的像素,这是相当分配的!

也就是说,应该有效地处理这些事件。在实际操作开始之前,在最后一条消息之后进行一个小的移位超时,应该延迟较大的操作。检索消息的来源是一项相当困难的任务,因为消息的发送者不易被检索(通常它是OS,除非您过度调用BeginInvoke)。

一个可能会提示的便利工具是SoftwareTrails。它提供了最近使用的类的热图。将其停靠在屏幕的一侧,同时在应用中单击。您可能会在系统和Mi​​crosoft命名空间中看到大多数活动,而您自己则看不到这些活动。如果不是,请检查您是否正在处理MouseHover事件或其他事情。

wndproc是Windows应用程序中最常用的例程,这是完全正常的。阅读注释后

编辑:

看起来像您所呼叫InvokeBeginInvoke挺配发,所以看这些方法在你的探查和使用调用图,看看有什么叫他们。不知道DotTrace是否具有完整的调用图,但它确实有一个调用树,但您需要一个图表才能看到所有调用者使用他们称之为函数的函数。这里有很多包含调用图的分析器。