2014-03-24 1 views
4

작업의 충돌 : 나는이 일을하고 때Parallel.Foreach 내가 같이 병렬 실행에 클라우드 이미지를 업로드하고

// Make a TaskFactory that will use the UI thread's context 
var uiFactory = new TaskFactory(TaskScheduler.FromCurrentSynchronizationContext()); 

Parallel.ForEach(FinalFileNames, 
    new ParallelOptions { MaxDegreeOfParallelism = 4 }, 
    path => 
    { 
     count++; 
     /* Calculate percentage of upload done */ 
     double iPercentDone = (int)(((float)count/iTotalFiles) * 100); 

     // Send the progress report to the UI thread. 
     uiFactory.StartNew(() => 
     UploadProgress.Value = iPercentDone; 

     LblProgress.Content = count.ToString(CultureInfo.InvariantCulture) 
           + " file(s) uploaded from " + iTotalFiles + 
        " file(s)"; 
         } 
     }); 

내가 직면 오전 문제의 UI가 차단됩니다. 그 이유는 같은 스레드에서 작동하는 것 같습니다.

"Task.Factory.New"에서이 Parallel.ForEach를 랩핑하면 해당 요구 사항이 아닌 비동기 호출이 발생합니다.

알려주십시오. UI 블록 문제를 해결하고 비동기 호출을 수행하지 못하게하려면 어떻게합니까?

+0

'uiFactory' 란 무엇입니까? –

+1

Application.DoEvents()를 시도한 적이 있습니까? 모든 foreach 후? – erem

+0

'Parallel.ForEach'는 이미지 업로드와 같은 IO 바인딩 작업을위한 것이 아닙니다. 비슷한 질문 : http://adackoverflow.com/q/22403856/1768303 – Noseratio

답변

2

Parallel.Foreach은 UI 스레드에서 시작될 때까지 UI 스레드를 차단하므로 시작된 작업은 대기열에 있지만 UI 스레드가 메시지 루프로 돌아갈 때까지 실행되지 않습니다. 비동기/await를 IProgress<T>

와 함께 참조

한 가지 방법은 Task.Run()를 사용하여 다른 스레드에서 Parallel.Foreach을 실행하는 것, 더 좋은 방법은 사용하는 것입니다

+0

이것은 비동기 방식이라고 생각하지만 파일 업로드 후 UI를 업데이트하고 싶습니다. 달성하는 방법 – Akon

+0

UI 스레드를 차단해서는 안됩니다. 파일 업로드를 선택하면 응용 프로그램이 "응답 없음"상태가됩니다. 비동기 방식이 필요합니다. – Bohdan

+0

모든 파일 업로드 시점을 어떻게 알 수 있습니까? 그게 내 주요 문제 야. – Akon

관련 문제