3

parallel.forループで「1つ以上のエラーが発生しました」という例外が発生します。

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) 

アプリは構造体のコレクションを取得し、各オブジェクトにはメタデータが含まれており、それらをデータベースに挿入します。

問題のあるコードは次のとおりです。

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=コレクションオブジェクト。

records=メタデータを含む構造体のリスト

fields=各レコード内の構造体。各レコードには、これらのリストが含まれています。

これは基本的にテーブルであり、行の構造体(各行に関するメタデータも含まれています)とセルの構造体が含まれています。このエラーはランダムに発生しているようです。私はここで何が間違っているのですか?

4

2 に答える 2

4

AggregateExceptionのInnerExceptionsプロパティを確認する必要があります。複数のスレッドが同時に例外をスローする可能性があるため、これはTPLのデフォルトの動作です。

詳細については、 http://msdn.microsoft.com/en-us/library/system.aggregateexception.aspxを参照してください。

私の推測では、スレッドセーフではないタイプのリソースがあります。並列スレッドがそれにアクセスしているとき、リソースは別のスレッドとの競合状態になり、例外が発生します。最初のタスクは、並列クエリのどの行が問題を引き起こしているのかを把握することです。データベースレベルの行ロックが適切でない場合は、データベースと関係がある可能性があります。

于 2012-10-19T21:54:06.970 に答える
0

これを処理する1つの方法はtry catch、並列ループ内にブロックを配置することです。ループ内で可能な場合は例外を処理して、。で発生しないようにしAggregateExceptionます。

于 2014-07-23T16:21:03.340 に答える