3 Stimmen

TPL Parallel For Loop Fehler

Ich erhalte eine Ausnahme "Ein oder mehrere Fehler sind aufgetreten" in meiner parallel.for-Schleife:

at System.Threading.Tasks.Task.ThrowIfExceptional(Boolean includeTaskCanceledExceptions)
at System.Threading.Tasks.Task.Wait(Int32 millisecondsTimeout, CancellationToken            cancellationToken)
at System.Threading.Tasks.Task.Wait()
at System.Threading.Tasks.Parallel.ForWorker[TLocal](Int32 fromInclusive, Int32 toExclusive, ParallelOptions parallelOptions, Action`1 body, Action`2 bodyWithState, Func`4 bodyWithLocal, Func`1 localInit, Action`1 localFinally)
at System.Threading.Tasks.Parallel.For(Int32 fromInclusive, Int32 toExclusive, ParallelOptions parallelOptions, Action`1 body)
at StaticClassLibrary.BLL.StaticClass.StatiMethod(String strExt, Object wTable, Object job, String BSPConnectionString) in c:\Users\FredWAD\Documents\Visual Studio 2010\Projects\PayrollCenterLibrary\BLL\ContributionFileManager.cs:line 218
   at myapp.staticlibrary.staticmethod(String str1, String str2) 

Die Anwendung nimmt eine Sammlung von Structs, wobei jedes Objekt Metadaten enthält, und fügt sie in eine Datenbank ein.

Der beanstandete Code lautet wie folgt:

Parallel.For(0, recordCnt, pOptions, d =>
               {
                   //flds = wTable.records[d].fields;
                   ssn = wTable.records[d].fields[fieldIndex].Value;
                   //rowId = wTable.records[d].fields[fieldIndex].rowId;
                   currentPerson = PersontManager.GetPerson(string1, string2);
                   hasContributions = WorkTableManager.RowHasContributionsNEW(List<string> lst, wTable.records[d]);
                   LoadRecordParallel(hasLoan, hasScratchpad, fieldIndex, wTable.records[d], object, string, string);
               }
           );

wTable = das Sammelobjekt.

records = eine Liste von Structs mit Metadaten

Felder = eine Struktur in jedem Datensatz. Jeder Datensatz enthält eine Liste dieser Felder.

Dies ist im Wesentlichen eine Tabelle, mit einer Struktur für eine Zeile (die auch einige Metadaten über jede Zeile enthält) und Strukturen für Zellen. Dieser Fehler scheint zufällig aufzutreten. Was mache ich hier falsch?

4voto

theMayer Punkte 14260

Sie müssen sich die Eigenschaft InnerExceptions der AggregateException ansehen. Dies ist das Standardverhalten für TPL, da mehrere Threads gleichzeitig Ausnahmen auslösen können.

Véase http://msdn.microsoft.com/en-us/library/system.aggregateexception.aspx für weitere Informationen.

Ich vermute, dass Sie eine Art von Ressource haben, die nicht thread-sicher ist; wenn parallele Threads darauf zugreifen, gerät die Ressource in eine Race Condition mit einem anderen Thread, was zu Ihrer Ausnahme führt. Die erste Aufgabe besteht darin, herauszufinden, welche Zeile Ihrer parallelen Abfrage das Problem verursacht, und diese dann zu untersuchen. Wahrscheinlich hat es etwas mit der Datenbank zu tun, wenn Ihre Zeilensperren auf Datenbankebene nicht ausreichend sind.

0voto

Jess Punkte 21803

Eine Möglichkeit, dies zu bewerkstelligen, besteht darin, eine try catch Block innerhalb Ihrer Parallelschleife. Behandeln Sie die Ausnahme, wenn Sie können, innerhalb der Schleife, damit sie nicht mit einer AggregateException .

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X