2011-03-31 80 views
1

我有一個應用程序進入高CPU使用率(緩慢隨着時間的推移),當ErrorProvider控件在幾個控件上連續設置閃爍的圖標。在WinForms中使用ErrorProvider時CPU使用率高,爲什麼?

高CPU使用率不是立即,但有一個緩慢上升,直到應用程序達到100%的CPU。

當沒有示出錯誤,則CPU返回到正常狀態。 ErrorProvider佔用CPU時間是否正常?

+0

正如漢斯表明,內存泄漏似乎最有可能,你創建一個新的* *'每次ErrorProvider'控制,或重用現有的? – 2011-03-31 13:35:39

+0

@Cody我重複使用相同的一個。看來我想這就是爲什麼我從來沒有見過它涉及到永遠閃爍在... – 2011-04-06 11:23:44

+0

,我做的第一件事是關閉惱人的閃爍我不確定它爲什麼需要默認值;錯誤指示器很容易看到它是否靜止不動。 – 2011-04-06 12:43:19

回答

2

根據該MS連接錯誤報告:Graphical Resources Leak In ErrorProvider

當存在與控制相關聯的錯誤,則ErrorProvider控件顯示在其右側一個閃爍圖標。我發現每次圖標閃爍時,都會在System.Drawing.Internal.DeviceContexts內部列表中添加一個新的DeviceContext。當我調用ErrorProvider對象上的Dispose()方法時,DeviceContexts列表不會被清除。

後果:默認情況下,圖標閃爍每250毫秒,以便4個DeviceContext對象添加到每秒System.Drawing.Internal.DeviceContexts列表。當一個ErrorProvider控件處於活動狀態,BlinkStyle是AlwaysBlink,該列表變得無限......當這個名單是非常大的(我已經與500000+對象看到了!)的應用程序繪製操作是非常非常非常慢:(

這個bug被標記爲固定的,但最近的評論說,它正在調查中。

3

這是不正常的。很可能你正在泄漏內存或窗口句柄。使用Taskmgr.exe,進程選項卡開始診斷。查看+選擇列並勾選內存(提交大小),句柄,USER對象和GDI對象。在您的應用運行時觀察這些列的值。

穩步增加值指示代碼中的問題,可以驅動多達CPU使用率。一個非常經典的問題是泄露USER句柄,通過使用Controls.Remove()或Controls.Clear()從表單中刪除控件並忘記處理這些控件而引發。

+0

好吧,這很奇怪,內存,手柄等不會增加! – 2011-04-01 13:08:36

+0

我能想到的唯一的其他場景是錯誤的事件訂閱,一次又一次地註冊相同的處理程序。然後,一個事件可能會產生相同方法的呼叫風暴。您最終需要調試以找出所有循環的位置。工具+附加到進程以附加調試器。分析器也會很方便。 – 2011-04-01 13:26:43

+0

似乎問題不在我的代碼畢竟是因爲如果我將控件設置爲不閃爍那麼沒有問題。只有當我設置連續閃爍。看起來像MS代碼中的錯誤! – 2011-04-06 11:25:32