の終わりに向かってそれぞれのために定期的なように振る舞う:500+レコードがあると仮定するとParallel.ForEachが、私はこのような何かを実行したときに、私はこの問題を抱えてい反復
Parallel.ForEach(dataTable.AsEnumerable(), row =>
{
//do processing
}
はパラレルたら870を言います.ForEachは850を完了すると、一度に1つの操作しか実行されていないようです。それは850の操作を非常に速く完了しましたが、それが反復の終わりに近づくと非常に遅くなり、それぞれのために通常のように機能しているようです。私は2000レコードを試してみました。
私のコードで何か問題がありますか?ご提案ください。以下は
私は間違った例を掲載、私は
申し訳ありませんを使用していたコードです。これは正しいコードです:
Task newTask = Task.Factory.StartNew(() =>
{
Parallel.ForEach(dtResult.AsEnumerable(), dr =>
{
string extractQuery = "";
string downLoadFileFullName = "";
lock (foreachObject)
{
string fileName = extractorConfig.EncodeFileName(dr);
extractQuery = extractorConfig.GetExtractQuery(dr);
if (string.IsNullOrEmpty(extractQuery)) throw new Exception("Extract Query not found. Please check the configuration");
string newDownLoadPath = CommonUtil.GetFormalizedDataPath(sDownLoadPath, uKey.CobDate);
//create folder if it doesn't exist
if (!Directory.Exists(newDownLoadPath)) Directory.CreateDirectory(newDownLoadPath);
downLoadFileFullName = Path.Combine(newDownLoadPath, fileName);
}
Interlocked.Increment(ref index);
ExtractorClass util = new ExtractorClass(SourceDbConnStr);
util.LoadToFile(extractQuery, downLoadFileFullName);
Interlocked.Increment(ref uiTimerIndex);
});
});
私は、これはコメントまたは回答する必要がありますが、私はそれを指摘する必要があると感じた場合はわからない、完全なコードブロック –
を提供してください: 'DataTable'はスレッドセーフタイプではありません。だから、もしあなたの '//処理している'コードが(まるで個々の行内のセルにさえ)何らかの修正を含んでいれば、あなたは痛みの世界を求めている、と私は恐れている。 –
DataTableのすべての行について、データベースへの呼び出しを行い、データをフェッチしてファイルにロードします。その抽出プロセスのような。データベースからデータを取得し、ファイルに抽出します。 –