WPF記憶體優化

2021-10-07 14:52:00 字數 2380 閱讀 8257

之前的乙個wpf專案,執行時程式的占用記憶體總是不斷增長,最後能把電腦的記憶體空閒記憶體全部占用,程式變得越來越卡,使用者吐槽過好幾次了。

看了看**,一直都沒怎麼做過wpf,程式裡面大量的使用了定時器,**全部是重複**,可讀性較差,很多問題, 先給了乙個鏈結

[wpf]解決程式執行時間長後記憶體占用太大(可能是洩漏),加個記憶體**釋放

看看內容,看看**,上網找找資料,這兩篇文章寫的挺詳細深入

c# winform應用程式占用記憶體較大解決方法整理**)– setprocessworkingsetsize

用setprocessworkingsetsize降低記憶體使用

lierda.wpfhelper裡的lierdacracker的注釋為「利爾達wpf記憶體壓縮類」,其中有乙個很明顯的成員變數[手動滑稽]

exename = "預付費水表管理系統.exe";

cracker方法有乙個時間引數 預設30s 方法內在新執行緒內執行flushmemory方法,執行後隔30s再次執行

flushmemory方法呼叫gc.collect()方法並使用gc.waitforpendingfinalizers()等待完成後,然後就呼叫了setprocessworkingsetsize方法

總的來說,方法不錯,但經過測試以後,在這個程式裡面並沒有什麼用:

那些gc**不掉的,強制gc**也沒用

程式一直是在前台執行的,setprocessworkingsetsize方法快取到硬碟上的資料,很快又會被讀出來,還增加了程式的開銷

順便提取了乙個工具類:

class wpfhelper

catch (exception ex)

}});

}[dllimport("kernel32.dll")]

private static extern bool setprocessworkingsetsize(intptr proc, int min, int max);

private static void flushmemory()

public static void crackeronlygc(int sleepspan = 30)

catch (exception ex)

}});

}}

最後主要改了兩種問題:

定時器(占用cpu), 整理內部邏輯,把十幾個定時器縮減為乙個

資源釋放(記憶體),this.dispose()this.dispose()this.dispose()

還是要養成好的編碼習慣,主動釋放的作用並不大;

c#裡面的資源分為兩類:

託管資源在引用計數為0的時候會被自動**,而非託管資源需要手動處理,呼叫dispose進行釋放。

釋放非託管資源的時候,除了使用dispose,還可以在使用using。

using關鍵字有兩個主要用途:

作為指令,用於為命名空間建立別名或匯入其他命名空間中定義的型別。

作為語句,用於定義乙個範圍,在此範圍的末尾將釋放物件。

作為語句

using 語句允許程式設計師指定使用資源的物件應當何時釋放資源。using 語句中使用的物件必須實現 idisposable 介面。此介面提供了 dispose 方法,該方法將釋放此物件的資源。

可以在 using 語句之前宣告物件。

可以在 using 語句之中宣告物件。

可以有多個物件與 using 語句一起使用,但是必須在 using 語句內部宣告這些物件。

使用規則

using只能用於實現了idisposable介面的型別,禁止為不支援idisposable介面的型別使用using語句,否則會出現編譯錯誤;

using語句適用於清理單個非託管資源的情況,而多個非託管物件的清理最好以try-finnaly來實現,因為巢狀的using語句可能存在隱藏的bug。內層using塊引發異常時,將不能釋放外層using塊的物件資源using語句支援初始化多個變數,但前提是這些變數的型別必須相同

針對初始化多個不同型別的變數時,可以都宣告為idisposable型別

using實質

在程式編譯階段,編譯器會自動將using語句生成為try-finally語句,並在finally塊中呼叫物件的dispose方法,來清理資源。所以,using語句等效於try-finally語句

using關鍵字在c#中的3種用法

WPF 效能優化

wpf windows presentation foundation 是微軟推出的基於windows的使用者介面框架,執行在 net framework 3.0及以上版本。wpf是基於directx引擎的,支援gpu硬體加速,在不支援硬體加速時也可以使用軟體繪製。儘管wpf有諸多優點,有時我們還是...

WPF優化體驗《一》

最近將乙個開發和維護了五年的乙個winform專案進行重構,考慮到最近很流行將使用者體驗掛在嘴上,於是採用了wpf技術,希望能在外觀和體驗上有乙個全新的效果。以前使用winform的時候記憶體控制得不錯,軟體使用一天下來也就100m左右,現在使用wpf,十分鐘就達到了100m,在感慨wpf的胃口之餘...

閒話WPF之二六(WPF效能優化點)

在建立漂亮ui的同時,我們還需要關注應用程式的效能,wpf尤其如此。下面從ms的文件中總結出了一些有用的效能優化點。在實際編寫的過程中,可以參考。這個post非完全原創,是根據一些文件總結出來的。1 建立邏輯樹的時候,盡量考慮從父結點到子結點的順序構建。因為當邏輯樹的乙個結點發生變化時 比如新增或刪...