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.
Pokaż kod gdzie wypełnić listę . –
Dodałem kod, który wstawia MyObjectList do pamięci podręcznej. Zakładam, że o to prosisz @TimSchmelter – maembe
"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 ... –