سؤال

والسيناريو لدي، هو في أسلوب التنفيذ من SPJobDefinition أريد أن أذهب من خلال كل SPSite في تطبيق ويب. لذلك ليس لدي التعليمات البرمجية التالية:

foreach (SPSite site in this.WebApplication.Sites)
{
  ...
}

والسؤال هو، هل أنا بحاجة للتخلص من كل موقع؟ حكم وعادة ما يذهب بها هي التخلص أو وضع داخل يستعمل فقط إذا أنا جديدة عنه نفسي. وأن الأجسام مواقع الممتلكات في الواقع تحتوي على تشييده بشكل كامل الموقع لتبدأ الذي سآخذ سوى إشارة إليها في هذا القانون. إذا كان الأمر كذلك ثم التخلص المواقع سيكون خطيرا كما أنا تعديل كائن آخر قد ترغب بها. أو العكس هو: هل الممتلكات مواقع بناء الأجسام عند الطلب .. في هذه الحالة هو أن بلدي responcibility للتخلص منها؟

وبالاضافة الى ذلك كيف يمكنني التخلص منهم إذا كنت بحاجة للقيام بذلك. لا أستطيع استخدام استخدام في هذه الحالة، وسوف استدعاء التصرف داخل foreach كسر التعداد؟

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

المحلول

ونعم لديك. انظر "كتابة تطبيقات وهذا مقياس لعدد كبير من المستخدمين" في أفضل الممارسات: عام الترميز المشاكل عند استخدام شير طراز كائن . النمط الصحيح هو:

foreach (SPSite site in this.WebApplication.Sites)
{
  try
  {
    ...
  }
  finally
  {
    site.Dispose();
  }
}

ودعوة التخلص لن كسر التعداد. انها مجرد ينظف الذاكرة غير المدارة التي يستخدمها الكائن.

نصائح أخرى

والتوجيه هنا http://www.sharepointdevwiki.com/display/public/ عندما + ل+ تخلص + شير + كائنات

ويشير إلى أن

//loop through each sub site
for (int i = 0; i <= rootweb.Webs.Count; i++)
{
  using (SPWeb subweb = rootweb.Webs[i])
  {
    //do stuff
  }
}

وهو الحل المفضل لهذه المشكلة.

وهناك أيضا أداة يمكنك تشغيل أكثر من حل للتحقق مما تقومون به الأمور في نصابها الصحيح. http://code.msdn.microsoft.com/SPDisposeCheck

scroll top