الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

كيف يمكننا التأكد من تحرير موارد النظام التي يستخدمها كودنا

بدأه محمد سامر أبو سلو في 11 أبريل 2009 · 4 رد · 2,835 مشاهدة · في Microsoft Visual Basic.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

يمكنك أن تستخدم بلوك using من أجل التأكد من أن كودك قد تخلص تماما من مصادر النظام التي يستخدمها وخصوصا عندما تستخدم أوامر تتطلب استخدام قدرا كبيرا من الذاكرة وذلك بغض النظر عن الطريقة التي استخدمتها للخروج من بلوك using حتى لو أطلق الكود استثناء غير معالج

فمثلا كي نتأكد من أننا قمنا بالتخلص من كامل كمية الذاكرة التي يستهلكها الاتصال بقاعدة البيانات يمكننا تضمينه ضمن بلوك using ونكتب الكود الذي يتعامل مع قاعدة البيانات داخل بلوك using كما في المثال

Imports System.Data.SqlClient

Public Class Form1

	Public Sub AccessSql(ByVal s As String)
		Using sqc As New System.Data.SqlClient.SqlConnection(s)
			MsgBox("Connected with string """ & sqc.ConnectionString & """")
		End Using
	End Sub

مع ملاحظة أن المتغير الذي تم تعريفه عند التصريح عن بلوك using مثل المتغير sqc في مثالنا هنا لايمكن الوصول إليه من خارج بلوك using لأنه يتم التخلص منه فور الخروج من البلوك كما يمكنك استخدام هذا البلوك من أجل العديد من مصادر النظام مثل فتح منفذ تسلسلي أو الكتابة إلى ملف وبشكل عام أنت تستخدم هذا البلوك عندما تريد أن تتأكد أن المصدر الذي تستخدمه يجب أن يكون متاحا فور الانتهاء منه

عن عائشة رضي الله عنها أن النبي صلى الله عليه وسلم قال: إن الله يحب إذا عمل أحدكم عملا أن يتقنه

نعيب زماننا والعيب فينا ... وما لزماننا عيب سوانا

ونهجو ذا الزمان بغير ذنب ... ولو نطق الزمان لنا هجانا

محمد سامر أبو سلو

#2

ذكر أحد الإخوة ملاحظة متعلقة بهذا الموضوع وهي

اقتباس
مع العلم أن المتغير الذي يعرف باستخدام Using يجب أن يضمن الواجهة IDisposable

مما ذكرني بموضوع لي وهو إدارة المصادر والواجهة IDisposable

عن عائشة رضي الله عنها أن النبي صلى الله عليه وسلم قال: إن الله يحب إذا عمل أحدكم عملا أن يتقنه

نعيب زماننا والعيب فينا ... وما لزماننا عيب سوانا

ونهجو ذا الزمان بغير ذنب ... ولو نطق الزمان لنا هجانا

محمد سامر أبو سلو

#3

بالاضافة للسابق استخدم الجاربج كلكشن اي بالعربي تنظيف الزبالة وهي كالتالي gc.Collect على سطر مستقل

<EMBED src=http://www.abdelghafar.com/images/banners/bm2.swf width=486 height=60 type=application/x-shockwave-flash EMBED < menu="false" loop="true" quality="high">

#4

شكرا لك على المداخلة ولكن

عملية Gc.Collect يجب أن لايتم تنفيذها برمجيا إلا عند الضرورة القصوى وقد تمت مناقشة استخدامها سابقا في المنتدى وأقتبس هذه الكلمات التي توضح ما أشير إليه

اقتباس
استخدام هذه العملية هي فكرة سيئة برمجيا ولايجب تنفيذها في البرامج الفعلية وأنك بتنفيذها يدويا ستخسر ميزة من ميزات optimization للفريموورك وأنه يجب تنفيذها فقط عندما يكون البرنامج في حالة idle كانتظار لإدخال المستخدم مثلا وأنها ممكن أن تتسبب في بطء النظام ولا يجب تنفيذها عندما يكون البرنامج يحاول الحصول على التحكم على قطعة هاردوير مثلا لئلا يؤثر على زمن الاستجابة
اقتباس
الافضل ان تتركgc يقوم بعمله دون اى تدخل منك

فعلاً عليك أن تتركه يقوم بعمله دون أي تتدخل منك وذلك لأن الموضوع شائك وإحتمالات أن تسهو عن شئ صغير يمكنه أن يكون سبباً في فشل التطبيق

اقتباس
ال Thread الخاص GC تكون الاولوية له low في الوضع العادي لكنها تنتقل الى high تلقائياً عندما يصبح الجهاز في الوضع الخامل Idle او عندما يكون هناك ضمور في الذاكرة او الموارد الخاصة بالجهاز، او عندما تقوم بإستدعائه بشكل مباشرة مثل المثال الذى ذكرته

طبعا عندما يعمل سوف يأثر ذلك على اداء البرنامج، لذلك يفضل ان لا تقوم بإستدعائه بشكل مباشر في اغلب الحالات لان ذلك سوف يؤثر بشكل عكسي على برنامجك

تم تعديل هذه المشاركة بواسطة محمد سامر أبو سلو في 13 أبريل 2009 في 18:41

عن عائشة رضي الله عنها أن النبي صلى الله عليه وسلم قال: إن الله يحب إذا عمل أحدكم عملا أن يتقنه

نعيب زماننا والعيب فينا ... وما لزماننا عيب سوانا

ونهجو ذا الزمان بغير ذنب ... ولو نطق الزمان لنا هجانا

محمد سامر أبو سلو

#5

جزاك الله خير يا محمد سامر أبو سلو

فانا لم اكن على علم بهذا الكلام , و لكنني كنت قد استخدمت مصادر الجهاز مثل الفايل ستريم و السكنر في برنامجي و لم يتم تحرير المصادر تلقائيا لذلك استخدمت ال GC

على كلا سوف اراجع كودي , شكرا لك

<EMBED src=http://www.abdelghafar.com/images/banners/bm2.swf width=486 height=60 type=application/x-shockwave-flash EMBED < menu="false" loop="true" quality="high">

مواضيع مشابهة