2012-03-22 4 views
2
foreach (string file in listToConvert) 
{ 
    BackgroundWorker backgroundWorker = new BackgroundWorker(); 
    backgroundWorker.WorkerReportsProgress = true; 
    backgroundWorker.DoWork += new DoWorkEventHandler(
    (s3, e3) => 
    { 
     newFile = sendFilesToConvert(file); 
    }); 

    backgroundWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(
    (s3, e3) => 
    { 
     listBoxFiles.Items.Add(newFile); 
    }); 

    backgroundWorker.RunWorkerAsync(); 
} 

목록의 각 파일은 다른 파일로 변환되며 각 BackgroundWorker는 변환이 끝날 때까지 대기하고 다음 BackgroundWorker 만 시작됩니다. 어떻게 할 수 있습니까?BackgroundWorker가 다른 것을 기다릴 수 있습니까?

+1

하나의 BackgroundWorker에있는 모든 파일을 변환하지 않으시겠습니까? – oxilumin

+0

왜 배경 작업자를 사용 하시겠습니까? 어느 쪽이든 당신은 단순히 각각의 이전 사건의 완성 된 사건에서 당신의 새로운 배경 작업자를 시작할 수 있습니다. –

+0

.Net의 어떤 버전을 사용하고 있습니까? 4.0을 사용하는 경우 단일 백그라운드 작업자와 동시 대기열을 사용할 수 있습니다. – pstrjds

답변

2

루프를 실행할 때마다 Bgw를 만들지 마십시오. 어쨌든 그것은 좋은 생각이 아닙니다.

하나의 단일 Bgw 안에 foreach()을 실행하기 만하면됩니다.

진행률 이벤트를 사용하여 결과를 목록 상자에 추가하거나 목록에서 수집 한 다음 완료되면 즉시 추가 할 수 있습니다.

+0

이것은 ConcurrentQueue 아이디어보다 낫습니다. ! – pstrjds

1

당신은이에 대한 TPL을 사용할 수

Task<List<newFile>> task1 = Task<List<newFile>>.Factory.StartNew(() => 
    { 
     List<newFile> newFiles = new List<newFile>(); 
    foreach(string file in fileList) 
    { 
     newFiles.Add(SendFilesToConvert(file)); 
    }; 

    return newFilesList; 
    }); 


    foreach(newFile nFile in task1.Result) 
    { 
    listBoxFiles.Items.Add(nFile); 
    }; 
+0

내가 사용하고 있습니다. 닷넷 3.5 작업을 포함하지 않습니다 – user979033

+0

죄송합니다 n/m 그럼. – Stephen

0

내가 알 수있는 바와 같이, 당신은 당신의 시나리오에서 UI 요소 (listBoxFiles)를 업데이트하고 싶습니다. 그래서 다음과 같은 코드를 사용할 수 있습니다 : 당신의 UI 스레드 그것이 당신의 UI 컨트롤을 업데이트해야하는 모든 시간을

BackgroundWorker backgroundWorker = new BackgroundWorker(); 
backgroundWorker.WorkerReportsProgress = true; 

var context = SynchronizationContext.Current; 
var filesList = // clone your listToConvert if it's not a local variable or other threads can access it 

backgroundWorker.DoWork += (s3, e3) => 
       { 
        foreach (string file in filesList) 
        { 
         var newFile = sendFilesToConvert(file); 
         context.Post(x => listBoxFiles.Items.Add(newFile), null); 

         // Report progress 
        } 
       }; 

backgroundWorker.RunWorkerAsync(); 

이 코드 게시물 메시지를 (비동기), 다음 UI 스레드 (ListBox.Items.Add(...))을 그에게 메시지를 전달하고 코드를 실행 적절한 맥락에서

+0

덕분에 많은 ... – user979033

관련 문제