저는 C# 콘솔 응용 프로그램을 작성 중이며 생성 된 모든 태스크가 완료되기 전에 기본 스레드가 닫히는 문제가 있습니다. 일반 프로그램 흐름은 다음과 같습니다.모든 스레드가 완료 될 때까지 기본 스레드가 대기하는지 확인
프로그램은 명령 줄 매개 변수로 디렉토리 경로를 사용합니다. 그런 다음 특정 확장자와 일치하는 디렉토리에있는 모든 파일을로 반복 열고 해당 파일을 분석하는 일치하는 각 파일에 대한 새 작업을 생성합니다 :
이Directory.GetFiles(directoryPath).ToList<string>().Where(x => Path.GetExtension(x) == ".xfast").ToList().ForEach(x => ProcessXFastFile(x));
이 파일의 각 다시 해당 CSV 값의 큰 숫자를 포함 고유 한 제품 키로 변환합니다. 예를 들어 하나의 파일에 1 백만 개의 CSV 회선과 400 개의 고유 한 제품 키가있을 수 있습니다. 프로그램의 요점은 제품 키를 기반으로 모든 줄을 정렬하고 키를 기반으로 개별 파일에 다시 작성하는 것입니다.
그래서 ProcessXFastFile 메서드에서 제품 코드를 Key 값으로 사용하고 해당 키와 일치하는 각 CSV 행을 해당 목록에 추가하여 Dictionary<string, List<string>>
을 만듭니다. 정렬이 완료되면
foreach (KeyValuePair<string, List<string>> entry in productDictionary) {
string writePath = String.Format(@"{0}\{1}-{2}.txt", directoryPath, hour, entry.Key);
List<string> quotes = entry.Value;
Task writeFileTask = Task.Factory.StartNew(() => WriteProductFile(writePath, quotes));
}
문제가된다 WriteProductFile에 대한 각각의 작업 전에 자신의 데이터를 쓸 수있는 기회를 갖습니다. 예를 들어, 하나의 파일을 제어 테스트로 사용하고 사전에 ~ 450 개의 고유 키가 있으므로 많은 파일을 써야합니다. 그러나 프로그램이 끝나기 전에 약 10 개의 파일 만 쓸 수 있습니다.
모든 작업을 완료 할 수있을만큼 프로그램을 오래 유지하려면 어떻게해야합니까? 어떤 도움을 주셔서 감사합니다. 당신은
var tasks = new List<Task>();
foreach (KeyValuePair<string, List<string>> entry in productDictionary) {
string writePath = String.Format(@"{0}\{1}-{2}.txt", directoryPath, hour, entry.Key);
List<string> quotes = entry.Value;
// add task to list
tasks.Add(Task.Factory.StartNew(() => WriteProductFile(writePath, quotes)));
}
// now wait for all tasks to finish, you'd also want to handle exceptions of course.
Task.WaitAll(tasks.ToArray());
이 WaitAll()
의 많은 변화가 있습니다
니스는 정말 당연한 것으로 보입니다. 지금 당장은 총리에게 줄 것입니다. –
그 완벽하게 일했습니다. 간결하고 쉬운 해결책을 가져 주셔서 감사합니다! –
문제가 없습니다! 다행스럽게 도울 수있어! –