[問題] C# 記憶體用量無法降低(0331中午更新)
最近在開發小程式 用到需要開啟子視窗
流程大致是這樣的:
先讀入檔案建立陣列
接著使用者可以用一些checkbox 控制 flowlayoutpanel 顯示符合條件的圖片
目前function部分是沒問題了
但頭痛的就是隨著使用者不斷的點選checkbox過濾時
記憶體流量會持續增加 壓不下來
自己的大致寫法如下:
建立陣列並顯示全部的圖片(略,只執行一次並用public,應該跟他沒關係吧)
計算checkbox的值控制要顯示哪些圖片(用C++寫法),並傳入下面函式處理
(將每個都去比較並顯示在flowlayoutpanel中)
PS.item_line_count已經有值
this.flowLayoutPanel1.Controls.Clear();//先全部清空
for (int i = 0; i < item_line_count; i++)
{
int usable = Convert.ToInt32(item_data[i][3]) & filter;
int type = Convert.ToInt32(item_data[i][2]) & map_use;
if (type == map_use && usable == filter)
{
PictureBox picItem = new PictureBox();
ToolTip tipitem = new ToolTip();
string describe;
picItem.Name = Convert.ToString(item_data[i][0]);//use item num as name
picItem.Image = Image.FromFile((Application.StartupPath)
+ @"\images\items_files\" + item_data[i][0] + ".gif");
picItem.Size = new Size(80, 80);
describe = item_data[i][4];
describe = describe.Replace("\\n",System.Environment.NewLine);
tipitem.SetToolTip(picItem, describe);
picItem.Click += (o, args) =>
{
textBox1.Text = describe;
this.SeletctedItem = picItem.Name;
};
this.flowLayoutPanel1.Controls.Add(picItem);
}
}
然後還有一個問題 子視窗關掉回到主視窗時 記憶體的用量並沒有釋放
請問有辦法讓它釋放嗎?
(因為這程式要執行多次執行子視窗,若壓不下來的話累積用量會很恐怖)
先在這邊謝謝各位指教
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 61.231.50.1
→
03/30 00:18, , 1F
03/30 00:18, 1F
推
03/30 02:05, , 2F
03/30 02:05, 2F
→
03/30 02:05, , 3F
03/30 02:05, 3F
→
03/30 02:08, , 4F
03/30 02:08, 4F
→
03/30 02:10, , 5F
03/30 02:10, 5F
→
03/30 02:10, , 6F
03/30 02:10, 6F
目前解了第一個問題
解法:後來換個寫法 把所有圖片load進去
checkbox過濾時,把不符合的項目的圖片visable設定成false
符合的為true
其實就只是藏起來不讓使用者發現而已...之前腦筋想太死
倒是第二個問題
如果用Dispose會造成釋放 後面的無法再呼叫
(也就是沒辦法再開第二次之後的子程式)
GC.Collect也有類似問題
我再想看看有沒有方法好了...
※ 編輯: chjimmy 來自: 61.231.50.1 (03/31 01:00)
推
03/31 01:47, , 7F
03/31 01:47, 7F
0331中午更新:
上策是能夠釋放資源 但新手如我應該想破頭也沒辦法...
後來算是取其中策 套用第一個的解法
偷懶的把子程式的visible設定false
造成第一次load吃資源 這時關掉只是隱藏起來而已
所以再呼叫只是把它visible變成true 所以顯示很快
但就變成要全部關掉才能完全釋放 也算是可以接受的結果
anyway,還是感謝提供想法的各位大大
※ 編輯: chjimmy 來自: 61.231.50.1 (03/31 13:40)