سؤال

ولدي ذاكرة التخزين المؤقت ثابت يقوم بتحديث في الوقت المحدد قائمة نوعية كائنات من قاعدة بيانات.

وانها مجرد قائمة ثابتة بسيطة:

private static List<myObject> _myObject;

public List<myObject> FillMyObject()
{
     if(_myObject == null || myTimer)
      _myObject = getfromDataBase();
}

ولقد 2 طرق لتحديث بلدي كائن يسمى UpdateMyObject وRemoveAnEntryFromMyObject.

ويبدو أن كل شيء لتشغيل غرامة ولكن الجميع مرة واحدة وبينما كنت تحصل على كمية كتلة من الأخطاء. ثم يذهب بعيدا ويبدو على ما يرام مرة أخرى. لا أحد يعرف ما الذي يجري؟

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

المحلول

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

    static readonly object lockObj = new object();
    private static List<myObject> _myObject;

     public List<myObject> FillMyObject()
     {
         lock (lockObj)
         {
            if(_myObject == null || myTimer)
               _myObject = getfromDataBase();
         }
     }


     public List<myObject> UpdateMyObject(somevalue)
     {
        lock (lockObj)
         {
            _myObject.RemoveAll(delegate(myObject o)
                                {
                                    return o.somevalue == somevalue;
                                 });)
         }
     }

استزادة

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