TPL을 사용하여 속도를 높이기 위해 일부 프로세스 집중 루핑을 다시 작성했습니다. 스레딩을 시도한 것은 이번이 처음이므로, 내가하고있는 일을 확인하고 싶은 것은 올바른 방법입니다.C# Parallel.foreach - 변수를 스레드로 안전하게 설정하기
결과 좋다 - Parallel.ForEach
루프 표준 foreach
루프에서 이동하는 경우 DataTable
1000 행의 데이터를 처리 구분 34 분의 처리 시간을 감소시켰다. 이 테스트에서는 로그 파일에 데이터를 쓰고 카운터를 증가시키는 것과 같은 스레드가 아닌 안전한 작업을 제거했습니다.
다시 로그 파일에 기록하고 카운터를 증가시켜야하므로 스트림러/증분 코드 블록을 포함하는 잠금을 구현하려고했습니다.
FileStream filestream = new FileStream("path_to_file.txt", FileMode.Create);
StreamWriter streamwriter = new StreamWriter(filestream);
streamwriter.AutoFlush = true;
try
{
object locker = new object();
// Lets assume we have a DataTable containing 1000 rows of data.
DataTable datatable_results;
if (datatable_results.Rows.Count > 0)
{
int row_counter = 0;
Parallel.ForEach(datatable_results.AsEnumerable(), data_row =>
{
// Process data_row as normal.
// When ready to write to log, do so.
lock (locker)
{
row_counter++;
streamwriter.WriteLine("Processing row: {0}", row_counter);
// Write any data we want to log.
}
});
}
}
catch (Exception e)
{
// Catch the exception.
}
streamwriter.Close();
위의 내용은 최소한의 성능 비용 (여전히 9 분의 실행 시간)으로 예상대로 작동하는 것 같습니다. 물론, 자물쇠에 포함 된 동작은 그다지 중요하지 않습니다. 자물쇠 내의 코드를 처리하는 데 걸리는 시간이 길어질수록 스레드가 잠길수록 처리 시간에 영향을 미칩니다.
내 질문 : 위의 작업을 수행하는 효율적인 방법입니까, 아니면 더 빠르고 안전한 다른 위의 다른 방법이 있습니까?
원래 DataTable
에는 실제로 30000 개의 행이 포함되어 있습니다. 이 DataTable
을 1000 행 단위로 나누어 처리 한 다음 한 번에 모든 300000 행을 처리하는 대신 Parallel.ForEach
에서 처리해야 할 것이 있습니까?
이 질문은 [Code Review] (http://codereview.stackexchange.com) –
에 속하므로 위의 코드는 컴파일되거나 실행되지 않습니다. 직접 추출물이 아닙니다. 필자는 멀티 스레딩과 변수를 스레드로부터 안전하게하는 이론에 더 관심이 있습니다. 그래도 고마워. – dalemac