2015-07-06 2 views
0

Я создал форму для длительных задач, цель состоит в том, чтобы петля Progress Bar до тех пор, пока Thread не завершится. Я показываю эту форму как диалог, чтобы мое основное приложение «Ожидание», пока эта форма не вернется.Looping до Background Thread Completes

К сожалению, мой RunWorkerCompleted вызывается до того, как Thread фактически завершит свою задачу.

Что такое эффективный метод ожидания окончания резьбы, БЕЗ присоединения?

public partial class FormProcessing : Form 
{ 
    public ThreadStart StartTaskFunc { get; set; } 

    public FormProcessing() 
    { 
     InitializeComponent(); 

     bgWorker.DoWork += bgWorker_DoWork; 
     bgWorker.ProgressChanged += bgWorker_ProgressChanged; 
     bgWorker.RunWorkerCompleted += bgWorker_RunWorkerCompleted; 
     Shown += (s, e) => 
     { 
      bgWorker.RunWorkerAsync(); 
     }; 
    } 

    void bgWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
    { 
     Close(); 
    } 

    void bgWorker_ProgressChanged(object sender, ProgressChangedEventArgs e) 
    { 
     progressBar1.Value = e.ProgressPercentage; 
    } 

    void bgWorker_DoWork(object sender, DoWorkEventArgs e) 
    { 
     var thread = new Thread(() => StartTaskFunc()); 
     thread.Start(); 
     int i = 0; 
     while (thread.IsAlive) 
     { 
      if (i == 26) 
       i = 0; 
      bgWorker.ReportProgress(i); 
      Task.Delay(200).Wait(); 
      i++; 
     } 
    } 
} 
+3

Похоже, вы должны просто использовать индикатор выполнения marquee, а не обычный индикатор выполнения, поскольку вы на самом деле не обновляете индикатор выполнения с любым значимым значением прогресса. – Servy

+0

У меня хорошее предложение, однако мне все еще нужно держать форму открытой до тех пор, пока Тема не завершится, никаких предложений? Или вы говорите, что выполняете задачу в Thread Form, и просто показываете Marquee? –

+6

Вы должны просто выполнять свою работу прямо в обработчике DoWork, а не создавать другой поток для этого. Поскольку вы создаете новый поток, который создает новый поток, а затем ждет его завершения. Просто не создавайте второй поток. – Servy

ответ

0

Вы создаете еще одну «тему» ​​в методе «bgWorker_DoWork».

Если вы создаете другой поток, «bgWorker_DoWork» будет завершен, как только будет создан новый поток.