C# WinForms应用程序评测

C# WinForms应用程序评测,c#,.net,multithreading,winforms,profiler,C#,.net,Multithreading,Winforms,Profiler,我们有一个C#WinForms应用程序,速度非常慢,通常会占用50%的CPU时间 通过使用DotTrace,我们发现最耗时的作业在UI线程上。 具体来说,System.Windows.Forms.DataGridView.WndProc(Message&)占用的时间最多 我知道程序在DataGridView控件上调用Invoke或BeginInvoke。这等于向DataGridView控件发送消息。但是在调用线程上发送这些消息所花费的时间非常少,而在UI线程上处理这些消息所花费的时间最多 因此,

我们有一个C#WinForms应用程序,速度非常慢,通常会占用50%的CPU时间

通过使用DotTrace,我们发现最耗时的作业在UI线程上。 具体来说,System.Windows.Forms.DataGridView.WndProc(Message&)占用的时间最多

我知道程序在DataGridView控件上调用Invoke或BeginInvoke。这等于向DataGridView控件发送消息。但是在调用线程上发送这些消息所花费的时间非常少,而在UI线程上处理这些消息所花费的时间最多

因此,dotTrace可以确定最耗时的作业在UI线程上,但无法确定哪些线程发送这些消息


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

首先,对于windows应用程序来说,wndproc将是调用最多、最耗时的方法。它是处理所有事情的应用程序的核心。当你用鼠标悬停在一个控件上时,它的wndproc处理程序将被调用,几乎鼠标穿过的每一个像素都会被调用,这是非常有限的

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

一个可能给出提示的便捷工具是。它提供了最近使用的类的热图。在应用程序中单击时,将其停靠在屏幕的一侧。您可能会在系统和Microsoft名称空间中看到大多数活动,而在您自己的名称空间中看到的活动较少。如果没有,请检查您是否正在处理鼠标悬停事件或其他事项

wndproc成为windows应用程序中最常调用的例程是完全正常的

阅读评论后编辑:


看起来您正在调用
Invoke
BeginInvoke
quity allot,因此请在探查器中查找这些方法,并使用调用图查看调用它们的内容。虽然不确定DotTrace是否有完整的调用图,但它确实有一个调用树,但您需要一个图,以便查看所有调用函数的调用方的调用频率。有很多分析器都包含调用图。

“我们有一个C#Winform应用程序,速度非常慢。它通常假设50%的CPU时间。”-真的吗?如果它真的很慢,我会期望峰值比这高很多……你有没有遇到过某种“UI更新风暴”?我的意思是,UI更新触发其他更新并级联…@MitchWheat是的,我使用Windows任务管理器来监视程序。CPU使用率始终在50%左右。实际上,这个程序是一个交易平台。它不断地从外部接收报价信息、订单状态信息等,进行一些计算,然后更新UI。我们正在写一个汽车交易的术语,所以它每秒发出大约100个订单。我们发现它无法快速处理所有传入的消息。所以我们需要找出瓶颈是什么。如果是UI,我们需要找出导致UI更新的原因,并可能降低更新频率。DataGridVew中可能有一个事件具有较长的进程和/或多次触发或无休止地激活,例如当单元格值更改或添加行时。是否使用Visual Studio?如果有,哪个版本?VS2012的评测工具是最新的,应该能提供您所需的所有细节,以找到问题的根源……这是一个标准错误,DGV经常被这样滥用。每秒向网格中添加100行只是“它工作!”的一个演示。没有人有机会真正查看它,每秒20行已经是一个无望的模糊。通过一次添加一行而不是一堆行来复合无用的UI,您也将使cpu崩溃。做一个可用性研究,你会得到你需要的反馈来创建一个有用的UI。速度问题也会自动解决。