2012-03-22 3 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 в каждом цикле цикла. В любом случае это не очень хорошая идея.

Просто запустите foreach() внутри одного Bgw.

Вы можете использовать событие прогресса, чтобы добавлять результаты в список или собирать их в списке и добавлять их все сразу, когда вы закончите.

+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

Я использую .Net 3.5, которые не включают Задачу – user979033

+0

Извините n/m then. – Stephen

0

Как я понял, вы хотите обновить UI элемент (listBoxFiles) в вашем сценарии. Таким образом, вы можете использовать следующий код:

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

Смежные вопросы