나는 데이터베이스를 쿼리하고 수십만 개의 레코드를 검색 중입니다. 그런 다음 반환 된 SqlReader를 읽고 레코드 당 새 작업을 만듭니다. 그런 다음 새 작업은 장기간에 걸친 작업을 수행합니다.대형 while 루프의 반복마다 작업을 만드는 데 성능 및/또는 안전 문제가 있습니까?
내 코드는 다음과 다소 같습니다
void ProcessRecords(SqlDataReader reader)
{
if (!reader.HasRows)
{
return;
}
using (reader)
{
while (reader.Read())
{
var filePath = BuildFilePath(reader);
var imageId = (int)reader["PhotoID"];
Task.Run(() => { ProcessRecord(imageId, filePath); })
.ContinueWith((task) => { Progress.Report("Processing " + Path.GetFileName(filePath)); });
}
}
}
내가 작업에 의해 사용되는 스레드의 수를 제한하는 세마포어를 사용하는 수석 개발자가 조언했다. 이것이 올바른 접근 방법인가요? 문제는 항상
표시된 코드를 사용하면 모든 레코드 처리가 완료되기 전에 'ProcessRecords'가 반환 될 수 있습니다. 그게 기대 되니? – svick
예, 예상됩니다. – ravp