2013-12-11 122 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是否具有完整的調用圖,但它確實有一個調用樹,但您需要一個圖表才能看到所有調用者使用他們稱之爲函數的函數。這裏有很多包含調用圖的分析器。