2016-02-15 9 views
5

Ungefähr einmal im Monat, haben wir in einen bizarren Fehler geraten, für den ich keine Erklärung habe. Der Fehler ist dies:Intermittierende Linq FirstOrDefault Fehler - Index war außerhalb der Grenzen des Arrays

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) 

Hier ist der Code ist, wo der Fehler passiert. Diese Methode wird im Konstruktor von MyObject genannt:

// 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); 
} 

Wenn der Fehler passiert, ist es 100% der Zeit geschehen wird, wenn dieses Verfahren läuft (was viel ist), bis zu recyceln ich den app-Pool, der es fixiert . Dies deutet darauf hin, dass es etwas mit dem Caching-Teil zu tun hat, aber es macht immer noch keinen Sinn für mich, da wenn ich MyObjectList aus dem Cache ziehe, nichts daran ändert, aber es scheint wie der einzige Weg dies zu sein Ein Fehler könnte auftreten, wenn MyObjectList während der ersten oder der ersten Änderung geändert wurde.

Der Fehler ist so selten und nicht vorhersehbar, dass wir ihn nicht neu erstellen konnten, daher würde jede Hilfe sehr geschätzt werden.

+0

Zeigen Sie den Code in dem Sie die Liste füllen . –

+0

Ich habe den Code hinzugefügt, der MyObjectList in den Cache einfügt. Ich gehe davon aus, dass Sie nach @TimSchmelter – maembe

+3

fragen, "sobald ich MyObjectList aus dem Cache ziehe, ändert sich nichts daran" - wie stellen Sie sicher, dass? Ich kann sehen, dass du es innerhalb des Codes, den du gegeben hast, hinzufüge, zum Beispiel ... –

Antwort

1

if (MyObjectList!= null) vielleicht versuchen, wie diese if (MyObjectList!= null && MyObjectList.Any(m => m.Id == this.Id)

und FirstOrDefault wird nur First vielleicht sein manchmal u eine leere Liste und u Rückfall für diese auf dem else Block

Verwandte Themen