چه موقع باید از متد GC.Collect() باید استفاده کرد - هفت خط کد انجمن پرسش و پاسخ برنامه نویسی

چه موقع باید از متد GC.Collect() باید استفاده کرد

0 امتیاز
با سلام راستش من تو جاهای مختلف سرچ کردم و تایپیک هایی زیادی رو دیدم ولی آخرش متوجه نشدم کجاو کی باید از این متد باید استنفاده کرد و اصلا چرا باید استفاده کرد مگه خود Clr زحمت جمع کردن حافظه رو نمیکشه پس من چرا بادی خودم رو درگیر این موارد کنم

ممنون
سوال شده آذر 22, 1392  بوسیله ی esafb52 (امتیاز 17)   1 2 6

1 پاسخ

+1 امتیاز
 
بهترین پاسخ

سلام.

در موارد بسیار نادری که شناخت کاملی نسبت به شی غیرمدیریت شده (unmanaged object) خود دارید می تونید از متد Collect برای باز پس گیری حافظه استفاده کنید ولی نکات زیر رو در نظر بگیرید :

در حالت کلی اشیایی که استفاده می کنید در دو دسته managed resourse و unmanaged resourse قرار میگیرن.

اشیا مدیریت شده مثل انواع داده ها مثل int و string و ... که این اشیا توسط CLR مدیریت میشن.  برای این اشیا، gorbage collector (GC بصورت کاملا مستقل و خودکار عمل بازپس گیری حافظه رو انجام میده. مثلا زمانیکه یک متغیر int تعریف می کنید و حافظه ای به این متغیر تخصیص داده میشه، نیازی نیست شما دستوری رو برای باز پس گیری حافظه این متغیر انجام بدید.

تمرکز شما فقط باید بر روی اشیای unmanaged resource باشه منظور از unmanaged resource هر شی ای هست که gorbage collector اطلاعاتی درباره این شی نداره و قاعدتا نمیتونه رفتار مطمئنی در بازپس گیری منابع از این اشیا داشته باشه. مثلا زمانیکه میخواید از کلاس filestream برای کار با فایل ها استفاده کنید چون این کلاس از windows API  برای باز کردن فایل استفاده میکنه و بخاطر نداشتن اطلاعات GC از این موارد نمیتونه بازپس گیری حافظه رو بصورت معمول انجام بده. یا مثلا یک کانکشن یک resorce هستش که به خودش حافظه اختصاص میده و البته توسط CLR قابلیت مدیریت شدن رو نداره. با توجه به اینکه کار با GC بسیار حساس هست توصیه میشه که شی مورد نظر رو dispoce کنید تا GC بتونه حافظه رو از این شی در زمان مناسب پس بگیره. راه دیگه استفاده از using statement هست . using تضمین میکنه که شی unmanage شما بعد از اتمام کارش، dispoce بشه.
 

using ( SqlConnection con = new SqlConnection() )

{

دستورات مورد نظرتون

}



 

یا در مورد filestream :


using ( FileStream fs = new FileStream() )

{

....

}



در پایان بلاک دستورات تضمین میشه که شی مورد نظر dispose بشه تا GC بتونه با اون بعنوان یک شی بدون مصرف برخورد کنه و حافظه رو از اون پس بگیره.

مایکروسافت توصیه میکنه که شما تا حد امکان از استفاده مستقیم از ()GC.Collect اجتناب کنید چراکه زمانیکه از این متد استفاده می کنید، متد collect تمام تردهای برنامه رو که در حال اجرا هستن به زور متوقف میکنه و همین امر احتمال بروز خطا رو ایجاد میکنه.

برای درک بهتر می تونید این موارد رو هم مطالعه بفرمایید :

http://msdn.microsoft.com/en-us/library/s5zscb2d%28v=vs.85%29.aspx

http://stackoverflow.com/questions/16646969/unmanaged-resources-and-dispose

پاسخ داده شده آذر 22, 1392 بوسیله ی veniz2008 (امتیاز 2,083)   1 5 21
انتخاب شد اسفند 11, 1392 بوسیله ی esafb52
...