2013-01-08 2 views
0

나는 장시간 for-each 루프를 가지고 있으며 시각적 사용자 피드백을 추가하는 관용적 방법이 있는지 궁금해서 사용자가 응용 프로그램이 충돌했다고 생각하지 않습니다.장기 실행 작업에 대한 시각적 피드백

private void btnRunLongRunningTask_Click(object sender, EventArgs e) 
{ 
    foreach(string path in Directory.EnumerateFiles(@"path"), "*.ext", SearchOption.AllDirectories)) 
    { 
     var result = LongRunning.Task(path); 
     string resultPath = Manipulate(path); 
     // write result to resultPath 
    } 
} 

이것은 도움이 될 수 있습니다. 작업 자체가 오래 걸리는 것은 아니지만 많은 작업이 소요될 수 있습니다.

어떻게 수행 할 수 있습니까? 내가 디렉토리를 논쟁의 대상으로 삼았 기 때문에 나는 작업이 수행 될 횟수를 조사한 다음 이에 따라 진행률 막대를 업데이트하고 작업자에게 작업 및 업데이트 코드를 실행하고 크로스 쓰레드 액세스를 관찰했다. 문제.

+0

진행률 막대? 반복 할 때마다 진행률 막대를 단계별로 진행합니다. – Botonomous

+0

배경 작업자를 사용하여보세요 - http://stackoverflow.com/questions/7546222/adding-a-progress-bar – MethodMan

+0

이것은 잠재적으로 [TPL] (http://msdn.microsoft. com/en-us/library/dd460717.aspx), 특히 [Parallel.Foreach] (http://msdn.microsoft.com/en-us/library/system.threading.tasks.parallel.foreach.aspx) (이렇게 LongRunning.Task가 thread 세이프 인만큼 긴), 이것은 상당히 고속 일 가능성이 있습니다. WinForms 이전에는 사용 해본 적이 없기 때문에 직접 호출 할 수 있는지 또는 Parallel.Foreach를 BackgroundWorker (또는 [TaskFactory.StartNew] (http://msdn.microsoft) .com/ko-us/library/dd321439.aspx), 더 간단합니다. – gregmac

답변

4

작업을 BackgroundWorker로 옮기고 ReportProgress 메서드를 사용할 수 있습니다.

for (i = 0; i < count; i++) 
{ 
    // do work 
    worker.ReportProgress((100 * i)/count); 
} 

private void MyWorker_ProgressChanged(object sender, 
    ProgressChangedEventArgs e) 
{ 
    taskProgressBar.Value = Math.Min(e.ProgressPercentage, 100); 
} 
+2

+1 'BackgroundWorker'는 새로운 스레딩 사용자에게 더 쉽게 구현 될 수 있습니다. –

관련 문제