Closed. This question does not meet Stack Overflow guidelines。它当前不接受答案。












想要改善这个问题吗?更新问题,以便将其作为on-topic用于堆栈溢出。

7年前关闭。



Improve this question




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

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

我知道该程序在DataGridView控件上调用Invoke或BeginInvoke。这等于将消息发送到DataGridView控件。但是,在调用线程上发送这些消息所花费的时间很小,大部分时间都在UI线程上来处理这些消息。

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

那么我该怎么做才能找到那些线程?

最佳答案

首先,对于Windows应用程序,可以预期wndproc将是最常用且最耗时的方法。这是处理所有内容的应用程序的心脏。当您将鼠标悬停在某个控件上时,几乎所有鼠标经过的像素都会调用它的wndproc处理程序,这是相当大的分配!

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

一个可能提示的便捷工具是SoftwareTrails。它提供了最近使用的类的热图。在应用程序中单击时,将其停靠在屏幕的一侧。您可能会在“系统”和“Microsoft命名空间”中看到大多数 Activity ,而在自己的名称中看到的很少。如果不是,请检查您是否正在处理MouseHover事件。

在Windows应用程序中,wndproc成为最常被调用的例程是完全正常的。

阅读评论后进行编辑:

看起来您正在相当大地调用InvokeBeginInvoke,因此请在探查器中查找这些方法,并使用调用图查看正在调用它们的对象。虽然不确定DotTrace是否具有完整的调用图,但是它确实具有调用树,但是您将需要一个图以便查看所有调用者以其调用函数的频率。有许多探查器,其中包括一个调用图。

关于c# - WinForms应用程序分析,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20513447/

10-11 19:24
查看更多