PDA

View Full Version : Memory Usage



Sorenaa_s
یک شنبه 06 خرداد 1386, 15:38 عصر
توی یک WinApp که من نوشتم، وقتی دیتای زیاد ( مثلا یه DataSet ) فراخوانی می کنم سایز برنامه تو حافظه شدیدا رشد میکنه (تا اینجا طبیعیه)، ولی وقتی از اون فرم خاص خارج می شم قاعد تاباید تمام object ها Dispose شده و حافظه آزاد بشه ولی این اتفاق نمی افته و خافظه به طور کامل آزاد نمیشه!!! واین باعث میشه که سایز برنامه تو حافظه دائم رشد کنه!
کسی در این مورد راه حلی داره؟

PC2st
یک شنبه 06 خرداد 1386, 19:47 عصر
در قسمت ویرایش کدهای Form1.Designer.cs ، در متد Dispose ، در داخل شرط if ، دیتاست رو Dispose کن.
بعد تست کن اگه فرم رو به شکل زیر از حافظه پاک کنی، درسته میشه ؟!!!!


frm1.Dispose( true );

شکارچی
یک شنبه 06 خرداد 1386, 22:34 عصر
از متد زیر استفاده کن.

GC.Collect();

باعث بکار افتادن Garbage Collector می شه که تمام آشغالهای(!) موجود در حافظه رو پاک می کنه.

Sorenaa_s
دوشنبه 07 خرداد 1386, 08:52 صبح
قبلا هردو روش رو استفاده کردم، ولی نشده.

PC2st
دوشنبه 07 خرداد 1386, 12:19 عصر
وقتی فرمها رو Close میکنم، حافظه تخصیص داده شده پاک میشه!

Sorenaa_s
دوشنبه 07 خرداد 1386, 12:38 عصر
لطفا میشه این کدساده رو چک کنید.

PC2st
دوشنبه 07 خرداد 1386, 15:42 عصر
متد Dispose از فرم 2 رو به شکل زیر تغییر بدید :


protected override void Dispose( bool disposing )
{
if( disposing )
{
if( components != null )
{
components.Dispose();
}
DataTable dt = ( ( DataTable )( dataGrid1.DataSource ) );
dt.Columns.Clear();
dt.Dispose();
dt = null;
dataGrid1.DataSource = null;
dataGrid1.Dispose();
dataGrid1 = null;
}
base.Dispose( disposing );
GC.Collect();
}

برای dispose کردن اشیاء managed، نمیدونم به روش صحیحی اونها رو Dispose کردم یا نه! :متفکر:
درضمن، اگر از متد GC.Collect استفاده نکنی، تا یک حدی، همینجوری حافظه انباشته میشه تا جائی که خود gc تشخیص بده که باید بصورت اتوماتیک حافظه لازم رو optimize کنه...