2012-04-12 8 views
0

Ich habe einen Thread, der Daten lädt, wenn ein Dienst gestartet wird. Ich rufe eine Methode in diesem Thread auf, die Parallel.Foreach verwendet, um eine Reihe von Daten zu iterieren. Aber die Linq-Abfrage, die ich in der parallelen Forerach habe, bekommt eine Objektreferenz, die nicht auf einen Instanzfehler gesetzt ist.Verwenden von Parallel.Foreach Inside Ein Thread

* Die gleiche Logik funktioniert, wenn ich die Parallel.Foreach entfernen oder wenn ich den Thread entfernen. * Selbst das Sperren der Liste hilft nicht. **

loadingThread = new Thread(new ThreadStart(PreloadData)); 
       loadingThread.IsBackground = true; 
       loadingThread.Start(); 
--------------------------------------- 

    public static void PreloadData() 
    { 
    Parallel.ForEach(loadedIDs.Keys, indexDefId => 
        { 
         List<FixingEvent> lst = null; 
         lock (loadedEvents) 
         { 
          lst = (from e in loadedEvents where e.DIVACode.Equals(indexDefId) select e).ToList(); 
         } 

--------------------------- 
    } 

Ich erhalte eine Ausnahme in der Linq-Abfrage innerhalb - 'e ist null und somit Objekt Referenzfehler'.

Jede Hilfe wird geschätzt.

+1

Wo wird 'loadedEvents' in Ihrem Code festgelegt? Diese Variable ist null und ist der Täter, brauchen mehr Informationen darüber. – yamen

+0

Sie ist bereits vor dem Start des Threads bereits ausgefüllt. Ich habe dies überprüft und es ist vollständig ausgefüllt und hat keine Nullwerte. In der Tat läuft derselbe Code gut, wenn ich ihn nicht von einem Thread aus anrufe. –

+0

Nennen Sie es an genau der gleichen Stelle im Code, wenn Sie es außerhalb des Threads starten? – yamen

Antwort

0

Ich denke, die Liste loadedEvents enthält null Elemente. Vielleicht wegen einer Wettlaufsituation.

+0

Bitte sehen Sie meinen Kommentar. –

+0

Ich akzeptiere dies als Antwort, denn wenn ich Null Bedingungen irgendwie überprüfen, funktioniert es gut. Trotzdem bin ich mir nicht sicher, warum das ohne Null-Checks funktioniert, wenn ich es einfach ohne einen separaten Thread ausfühle. Ich vermute auch einige Wettlaufbedingungen. –

0

Sie sollten das Objekt loadedEvents nicht sperren. Nach msdn:

Best Practice ist ein eigenes Objekt zu erfassen, oder ein privater statischen Objektvariable zum Schutz von Daten, die für alle Instanzen zu definieren.

Sie müssen das Objekt, auf das Sie zugreifen, nicht sperren - Sie brauchen lediglich ein Objekt, auf das Sie zugreifen können.

+0

danke für den Tipp. Aber leider ist das Problem nicht so. Irgendwie bekomme ich einen NULL-Referenzfehler, wenn ich die parallel.foreach in einem Thread aufruft. –

Verwandte Themen