2012-11-14 5 views
2

저는 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>>을 만듭니다. 정렬이 완료되면

, 나는 사전을 반복하고 각 키 값을 새 작업을 산란하고 목록에서 CSV 라인을 쓰기 :

는 주 스레드가
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()의 많은 변화가 있습니다

답변

5

당신은 완료 대기 할 Task.WaitAll()를 사용하여 다음 그냥 그들을 만들고 던지기 대신에 당신이 List<Task>에 들어가 모든 작업을 넣어 수 있습니다 (위와 같이) 무한정 대기하거나 TimeSpan을 기다린 후 시간이 초과되면 진행 메시지를 인쇄하고 다시 기다립니다.

+0

니스는 정말 당연한 것으로 보입니다. 지금 당장은 총리에게 줄 것입니다. –

+0

그 완벽하게 일했습니다. 간결하고 쉬운 해결책을 가져 주셔서 감사합니다! –

+0

문제가 없습니다! 다행스럽게 도울 수있어! –

관련 문제