2016-02-15 12 views
5

Raz na miesiąc, natknęliśmy się na dziwaczny błąd, którego nie mam żadnego wyjaśnienia. Błąd jest następujący:Intermittent Linq FirstOrDefault Error - Indeks był poza obszarem tablicy

System.IndexOutOfRangeException: Index was outside the bounds of the array. 
at System.Collections.Generic.List`1.Enumerator.MoveNext() at 
System.Linq.Enumerable.FirstOrDefault[TSource](IEnumerable`1 source, Func`2 predicate) 

Oto kod, w którym wystąpił błąd. Metoda ta nazywana jest w konstruktorze MyObject:

// pull a list of MyObjects from the cache so we can see if this one exists 
List<MyObject> MyObjectList= System.Web.HttpRuntime.Cache["MyObjects"] as List<MyObject>; 
if (MyObjectList!= null) 
{ 
    // this is where the error happens. Just getting an object out based on its id 
    MyObject obj = MyObjectList.FirstOrDefault(m => m.Id == this.Id); 

    if(obj != null){ 
     // great, it already exists in the cache 
    } 
    else{ 
     // doesn't exist in the cache, query the database and then add it to the cache 
      //add it to the cache after loading from db 
      MyObjectList.Add(this); 
      System.Web.HttpContext.Current.Cache.Insert("MyObjects",MyObjectList); 
    } 
} 
else{ 
    // instantiate a new list, query the db for this object, add it to the list and add the list to the cache 
    MyObjectList= new List<MyObject>(); 

    //add it to the cache after it was loaded from the db 
    MyObjectList.Add(this); 
    System.Web.HttpContext.Current.Cache.Insert("MyObjects",MyObjectList); 
} 

Gdy błąd się stanie, to się stanie w 100% czasu, gdy ta metoda działa (co jest dużo), aż recyklingu pulę aplikacji, który naprawia go . Sugeruje mi to, że ma to coś wspólnego z częścią pamięci podręcznej, ale nadal nie ma to dla mnie sensu, ponieważ gdy raz wyciągnę MyObjectList z pamięci podręcznej, nic go nie zmieni, ale wydaje się, że to jedyny sposób błąd mógłby się zdarzyć, gdyby MyObjectList było w jakiś sposób modyfikowane podczas pierwszego zdarzenia.

Błąd jest tak rzadki i niemożliwy do przewidzenia, że ​​nie byliśmy w stanie go odtworzyć, więc wszelka pomoc byłaby bardzo doceniana.

+0

Pokaż kod gdzie wypełnić listę . –

+0

Dodałem kod, który wstawia MyObjectList do pamięci podręcznej. Zakładam, że o to prosisz @TimSchmelter – maembe

+3

"ponieważ od razu wyciągam MyObjectList z pamięci podręcznej, nic go nie modyfikuje" - jak to zapewniasz? Widzę, że dodajesz do niego w podanym kodzie, na przykład ... –

Odpowiedz

1

if (MyObjectList!= null) może spróbować jak to if (MyObjectList!= null && MyObjectList.Any(m => m.Id == this.Id)

i FirstOrDefault będzie tylko First może czasami u mają pustą listę i u mają awaryjne dla tego na bloku else

Powiązane problemy