PDA

View Full Version : ایراد در Dispose شدن فرم!!



naeeme
شنبه 27 بهمن 1386, 10:52 صبح
در یک برنامه، یک فرم owner و چند فرم owned وجود دارد. از یک Datatable عمومی نیز برای پر کردن Combo box های موجود در فرم های مختلف استفاده می شود. یک ایرادی که در برنامه به وجود
آمده این ست که پس از بستن یک فرم Owned و Dispose کردن آن، هنوز متغیرها و کنترلهای این فرم قابل دسترس هستند و اگر در این Datatable عمومی تغییری ایجاد شود، در فرمهای Ownedیی که قبلا باز شده و اکنون بسته شده اند، eventهای مربوط به تغییر comboها فراخوانی میشود.
فکر می کنید ایراد از کجاست؟
برای بستن فرم ها اول فرم را Dispose کرده و سپس آن را Close می کنم.

Masoud_TB
شنبه 27 بهمن 1386, 11:26 صبح
اول اینکه چه نیازی به Dispose کردن دارین؟؟
بعد هم اینکه به نظر من می تونین اول Close کنین و بعد Dispose رو فرا خونی کنین.
و نکته آخر هم اینکه Dispose موقعی عمل خواهد کرد که شما Reference تون رو از اون شیء بردارین. به این نکته صراحتا در MSDN اشاره شده است.

Call Dispose when you are finished using the Component. The Dispose method leaves the Component in an unusable state. After calling Dispose, you must release all references to the Component so the garbage collector can reclaim the memory that the Component was occupying.




Form f= new Form();
// ‌نمایش و ....
f.Close();
f.Dispose();
f = null;
یا اینکه اجازه بدین که f خود به خود و با خروج از Block of Code از بین رود تا Garbage Collector وظیفه خودش رو انجام بده.

naeeme
شنبه 27 بهمن 1386, 13:10 عصر
کدهایی که شما نوشتین رو نمی تونم استفاده کنم چون شما f=null نوشتین اما من به f دسترسی ندارم و this=null هم صحیح نیست.
این فرم ها به این صورت نمایش داده میشن.:


frmSample fr=new frmSample();
fr.Show();

و هنگامی که قرار است بسته شود:


this.Close();

کد نمایش در فرم اصلی قرار دارد. حالا با این شرایط چه جوری میشه فرم را Null کرد؟

Masoud_TB
شنبه 27 بهمن 1386, 13:42 عصر
خوب شما در این حالت نیازی به null کردن ندارین.

naeeme
شنبه 27 بهمن 1386, 14:01 عصر
دقیقا اشکال در همین جاست . نکته عجیب در همین هست. وقتی فرم CLOSE شده، دیگه نباید هیچ کدوم از متغیرها یا کنترلهای فرم موجود باشند اما موجود هستند!! و دردسرساز!

رضا عربلو
شنبه 27 بهمن 1386, 20:52 عصر
دستور Dispose باعث ازاد شدن حافظه تخصیص داده شده به منابع مدیریت شده (managed resources) از قبیل فرم ها و ... نمی شود. در واقع این دستور تنها برای آزاد سازی منابع غیر مدیریت شده (Unmanged Resiurces) از قبیل هندل یک فایل که با استفاده از توابع Api بدست آمده است و ... می شود.
در مورد اینکه بعد از بستن یک فرم چرا همچنان می توانید به متغیرر های داخل آن دسترسی داشته باشید نیز به این نکته توجه داشته باشید که garbage collector دارای یک الگوریتمی است که بر طبق آن هنگامی که می خواهد عمل رباله روبی را (garbage collecting) انجام دهد تشخیص می دهد که آیا این آبجبکت دیگر مورد نیاز است و یا نیست و تنها آبجکت های که مورد نیاز نمی باشد را از حافظه پاک می کند.بنابر این اگر فرض کنیم شما یک همچین کدی را نوشته باشید:


frmSample fr=new frmSample();
fr.Show();
fr.Close();
GC.Collect();
....
fr.Show();

حتی با فراخوانی متد GC.Collect(); فرم fr شما از حافظه پاک نمی شود چون GC تشخیص می دهد که همچنان این آبجیکت مورد نیاز می باشد.