의 끝 부분에 각각 정규처럼 행동 : 500 개 레코드가 있다고 가정Parallel.ForEach 나는 이런 식으로 뭔가 실행했을 때 나는이 문제가 발생하고 반복
Parallel.ForEach(dataTable.AsEnumerable(), row =>
{
//do processing
}
는 병렬 일단 (870) 말 .ForEach 850 완료, 그것은 순차적으로 즉, 한 번에 하나의 작업을 실행하는 것 같습니다. 그것은 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'은 thread-safe 타입이 아닙니다. 그래서 만약 당신의'// do do'' 코드가 어떤 종류의 변형 (모든 행의 셀까지)을 포함한다면, 여러분은 고통의 세계를 요구하고 있습니다, 나는 두려워합니다. –
DataTable의 모든 행에 대해 데이터베이스를 호출하여 데이터를 가져 와서 파일로로드합니다. 그것은 추출 과정과 같습니다. 데이터베이스에서 데이터를 가져 와서 파일로 추출합니다. –