silanos_1

Analytics

ad silanors2

2011年12月15日 星期四

[WinForm]使用 GC.Collect解決Form與Form之前的傳遞 造成記憶體無法回收(Use GC.Collect resolve transfer From the Form before causing memory can not be recovered)


問題

Form與Form之前的傳遞 造成記憶體無法回收
當有類似A Form呼叫B Form ,使用者須於B處理資料以後,更新回A的需求時,通常會在B的程式裡加上A的屬性,如下:
A Form 畫面
1
2
B Form 畫面
3
4
寫法如下:
B Form定義A Form的屬性,將A Form傳回
public GCTestMain MainForm
{
    get;
    set;
}

因此當B更新資料以後,要傳回給A時,直接呼叫A進行資料更新,並關閉如下:
MainForm.dataGridView1.DataSource = null;
MainForm.dataGridView1.Refresh();

MainForm.dataGridView1.DataSource = this.dataGridView1.DataSource;
MainForm.dataGridView1.Refresh();
this.Close();
但記憶體卻始終沒回收!!
5




解決方法

在B Form呼叫A Form 更新資料以後,強制GC回收,如下:
MainForm.dataGridView1.DataSource = null;
MainForm.dataGridView1.Refresh();
GC.Collect();
GC.WaitForPendingFinalizers();

MainForm.dataGridView1.DataSource = this.dataGridView1.DataSource;
MainForm.dataGridView1.Refresh();
this.Close();
很快的就會看到效果(測試程式裡的GRID有66萬筆資料,所以記憶體佔3百多MB是正常的):
6

沒有留言:

as silanors3

熱門文章

bloggerads