سؤال

أساسا أريد أن أعرف إذا كان في VB.NET 2005 حالة استخدام sqlcommand ثم إعادة استخدامها باستخدام الجديد هو الخطأ.سيكون سببا في تسرب الذاكرة.

على سبيل المثال:

try

dim mySQL as new sqlcommand(sSQL, cnInput)

// do a sql execute and read the data 

mySQL = new sqlcommand(sSQLdifferent, cnInput)

// do sql execute and read the data
catch ...

finally

if mysql isnot nothing then
   mysql.dispose
   mysql = nothing
end if

تحرير:وضع محاولة الصيد في تجنب تعليقات حول عدم استخدامها

هل كانت مفيدة؟

المحلول

فقط لتوسيع ما Longhorn213 قال هنا الرمز من أجل ذلك:

Using mysql as SqlCommand = new SqlCommand(sSql, cnInput)
  ' do stuff'
End Using

Using mysql as SqlCommand = new SqlCommand(otherSql, cnInput)
  ' do other stuff'
End Using

(تحرير) كما FYI, باستخدام تلقائيا يلتف كتلة من التعليمات البرمجية حول محاولة/أخيرا أن يدعو أسلوب التخلص على متغير يتم إنشاؤه مع.وبالتالي, انها طريقة سهلة للتأكد من الموارد الخاصة بك يتم تحريرها. http://msdn.microsoft.com/en-us/library/htd05whh(مقابل.80).aspx

نصائح أخرى

جمع القمامة جمع ما يصل أول جديد عندما يتم تشغيله.

فقط ثانية واحدة كنت عمدا التصرف في النهاية كتلة.أول واحد سيتم التخلص منها في المرة القادمة جمع القمامة هو تشغيل.

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

سيكون أفضل طريقة للتخلص الأمر الأول بعد الانتهاء من استخدامه ، ومن ثم إعادة استخدامها.

اه, إلى كل هؤلاء الناس قائلا "لا بأس, لا تقلق بشأن ذلك ، GC سيتم التعامل معها..." كله نقطة من Dispose نمط التعامل مع تلك الموارد GC لا يمكن التصرف.حتى إذا كان كائن يحتوي على Dispose الأسلوب الأفضل أن نسميها عندما كنت فعلت مع ذلك!

في ملخص, Longhorn213 هو الصحيح ، والاستماع له.

شيء واحد أنا لم يعمل بها - إذا كان لدي الدرجة تنفيذ IDisposable, لكنني في الحقيقة لم التصرف بنفسي, أنا مجرد ترك الأمر معلقا حول GC ، GC يدعو فعلا Dispose بالنسبة لي ؟

لا جامع القمامة سوف تجد النسخة القديمة من mySql و تخصيص ذلك في الوقت المناسب.

جامع القمامة يجب أن تلتقط أي شيء تم dereferenced طالما أنه لم يتم نقله إلى كائن كبير كومة.

في حين جمع القمامة تنظيف بعد في نهاية المطاف التخلص نمط هناك لمساعدة نظام الإفراج عن أي الموارد المقترنة مع الكائن عاجلا لذا عليك الاتصال التصرف ذات مرة كنت فعلت مع الكائن قبل إعادة تعيين إلى ذلك.

كن حذرا.إذا كان عليك أن تفعل الكثير من هذه في حلقة يمكن أن تكون بطيئة.انها أفضل بكثير من مجرد تحديث .CommandText الملكية من نفس الأمر, مثل هذا (أيضا ، يمكنك تنظيف جملة قليلا):

Using mysql as New SqlCommand(sSql, cnInput)
  ' do stuff'

    mySql.CommandText = otherSql

   'do other stuff'
End Using

بالطبع هذا يعمل فقط إذا كان الأمر الأول لم تعد نشطة.إذا كنت لا تزال في منتصف يمر datareader ثم من الأفضل إنشاء أمر جديد.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top