تمام سوالات سوالات بدون پاسخ سوال بپرسید
1

در این مورد مطالبی را در msdn مطالعه کرده ام. متوجه شدم که از این بلاک برای آزاد کردن منابع استفاده می شود. اما سوال من این است که مگر آزاد کردن حافظه توسط GC انجام نمی شود؟ پس چرا باید این کار را خودمان انجام دهیم یا حتی کلمه کلیدی در #C گذاشته شود؟ از دوستانی که دانش شون رو به اشتراک می گذارند، واقعاً ممنونم.

1 پاسخ

11

برای پاسخ به این سوال باید کمی در نحوه ی کار CLR دقیق شویم

Using برای ایجاد شی از کلاس هایی استفاده میشود که اینترفیس IDisposable را پیاده سازی کرده اند. این اینترفیس دارای متدی است با نام Dispose ، هنگامی که ما یک بلاک Using ایجاد میکنیم مانند زیر:

using (MyDisposableClass c  = new MyDisposableClass())
{
   // ToDo : Something
}

این تعریف ما خود به خود به تعریف زیر در زبان IL تبدیل خواهد شد

MyDisposableClass c = new MyDisposableClass();
try 
{
   // ToDo : Something
}
finally 
{
   c.Dispose();
}

معمولا کلاس هایی که اینترفیس مذکور را پیاده سازی میکنند، آنهایی هستند که به یک یا چند منبع از منابع Unmanaged سیستم دسترسی دارند و استفاده میکنند. این منابع معمولا دارای محدودیت در استفاده هستند. هنگامی که شما کارتان با یک متغییر تمام میشود، به راحتی اجازه میدهید که GC عملیات جمع آوری آن را انجام دهد. اما ماموریت GC جمع آوری اطلاعات هرز و آزاد سازی حافظه است نه آزاد سازی منابع سیستمی.

اجازه بدهید از مثالی که برای خودم پیش آمده است استفاده کنم. من یک نرم افزار ارسال پیامک از طریق مودم های GSM طراحی کرده بودم. برای ارسال یک پیامک باید ابتدا یک شی از کلاس مودم ساخته میشد و بعد از یکسری تنظیمات، پیامک ارسال میشد. هنگامی که من از این کلاس بدون استفاده از بلاک Using استفاده میکردم، و بدون فراخوانی متد Dispose کار را به عهده ی GC قرار میدادم، دو مشکل پیش می آمد: اول اینکه حافظه ی مصرفی بازگردانی نمی شد تا زمانی که سیستم با مشکل کمبود حافظه مواجه میشد یا اینکه مستقیم متد GC.Collect فراخوانی میشد.، دوم و مهمتر اینکه، چون مودم جزو منابع محدود سیستم بود و در آن واحد تنها یک برنامه میتوانست به آن متصل شود، مودم در حالت مشغول باقی میماند و در صورتی که مجددا قصد استفاده از مودم را داشتم، خطای Modem is already in use صادر میشد. دلیل هم این بود که گرچه GC کار خود را درست انجام داده بود و شی ایجاد شده را از حافظه خارج ساخته بود، اما چون این عملیات، روند صحیح خود را طی نکرده بود، مودم هنوز برای شی قبلی رزرو شده بود.

این مشکل در مورد بسیار از کلاس ها که با منابع سیستم کار میکنند پیش خواهد آمد، مانند: شبکه، فایل ها، فونت ها، سخت افزارهای جانبی و ... . برای پایان به روند استفاده از یک منبع باید از متد Dispose استفاده نمایید حال میتوانید از Using Block استفاده نمایید و یا مانند نمونه ای که بیان شد به صورت دستی فراخوانی کنید که البته توصیه نمیشود.

1

فرمایشات آقا amir@ کاملاً درست است. برای دسترسی به مطلب بیشتر در این زمینه می تونید به مقاله ای که در مورد آزاد سازی منابع در همکدی نوشته شده رجوع کنید.

(10 آوریل '12, 22:51) SeriousAnt
toggle preview



آموزش زبان برنامه نویسی C#
آموزش jquery
آموزش برنامه نویسی
آموزش طراحی وبسایت
آموزش مدیریت وبسایت
آموزش جاوا Java
آموزش پایتون Python
آموزش سی شارپ C#‎
آموزش HTML و CSS
آموزش JavaScript جاوااسکریپت
آموزش jQuery جی کوئری
آموزش ساخت ربات تلگرام
آموزش برنامه‌نویسی PHP
آموزش برنامه‌نویسی اندروید
● آموزش‌های رایگان

سوالات مرتبط

راهنمای استفاده از ویرایشگر
  • *ایتالیک*‌ یا __ایتالیک__
  • **ضخیم** یا __ضخیم__
  • آدرس:[متن](http://url.com/ "عنوان")
  • عکس?![alt متن](/path/img.jpg "عنوان")
  • لیست عددی: 1. Foo 2. Bar
  • برای رفتن به خط بعد، هر جا مایلید که خط جدید شروع شود دو کاراکتر فاصله (space) قرار دهید
  • تگ‌های ساده HTML هم پشتیبانی می‌شوند

تگها:
  • ×209
  • ×34
  • ×1
  • ×1
  • پرسیده شده: 09 آوریل '12, 00:37
  • بازدید: 5,676 بار
  • آخرین بروزرسانی: 10 آوریل '12, 22:52

این سوال را دنبال کنیدتوسط ایمیل: ایمیل شما (باید معتبر باشد, هرگز به دیگران نمایش داده نمیشود):

هنگامی که شما به سیستم وارد شوید،قادر خواهید بود برای بروز رسانی ها مشترک شوید.


توسط RSS:

پاسخها

پاسخها و نظرها