是否有可能BackgroundWorker会等到另一个?

时间:2012-03-22 15:22:20

标签: c# .net-3.5

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 我怎么能这样做?

3 个答案:

答案 0 :(得分:2)

不要在循环的每次运行中创建Bgw。无论如何,这不是一个好主意。

只需在一个Bgw中运行foreach()即可。

您可以使用progress事件将结果添加到列表框中,或者在列表中收集它们,并在完成后立即添加所有结果。

答案 1 :(得分: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);
   };

答案 2 :(得分: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控件时都会向UI线程发送一条消息(异步),然后UI线程调度消息并在适当的上下文中执行代码(ListBox.Items.Add(...))。