2016-07-01 20 views
0

Warum funktioniert mein Hintergrundarbeiter nicht für Fortschrittsbalken (standardmäßig Sichtbarkeit auf falsch festlegen.).Warum funktioniert mein Hintergrundarbeiter nicht für Fortschrittsbalken?

Ich versuche, einen Fortschrittsbalken im Hintergrund zu haben. Wenn der Benutzer auf OK klickt, starte ich den Timer und mache den Fortschrittsbalken sichtbar. und führen Sie backgroundWorker.RunWorkerAsync(); und im backgroundWorker_RunWorkerCompleted setze ich die Sichtbarkeit der Fortschrittsanzeige auf false.

Das Problem ist, es zeigt nur die Fortschrittsleiste, aber zeigen Sie nicht den Fortschritt.

Mein Code ist hier:

 private void btnOk_Click(object sender, EventArgs e) 
     { 
      timer.Start(); 
      progressBar.Visible = true; 
      backgroundWorker.RunWorkerAsync(); 
      doSomeWork(); 
     } 

private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e) 
     { 
     } 

     private void backgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
     { 
      timer.Stop(); 
      progressBar.Visible = false; 
     } 

     private void timer_Tick(object sender, EventArgs e) 
     { 
      MessageBox.Show("called"); 
      if (progressBar.Value == progressBar.Maximum) 
      { 
       progressBar.Value = progressBar.Minimum; 
       return; 
      } 
      progressBar.PerformStep(); 
     } 

     private void backgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e) 
     { 
      progressBar.Value = e.ProgressPercentage; 
     } 

Warum kommt es nicht Fortschritt in der Statusleiste? Was ist daran falsch?

+0

'Problem ist es zeigt nur den Fortschritt, aber zeigen Sie nicht den Fortschritt.' Was meinst du? – currarpickt

+0

siehe bitte bearbeiten. –

Antwort

2

Ihre backgroundWorker_DoWork macht nichts. Verschieben doSomeWork in DoWork Ereignis. Und Sie müssen ReportProgress auf true setzen.

private void btnOk_Click(object sender, EventArgs e) 
{ 
    timer.Start(); 
    progressBar.Visible = true; 
    backgroundWorker.ReportsProgress = true; 
    backgroundWorker.RunWorkerAsync(); 
} 

private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e) 
{ 
    doSomeWork(); 
} 

private void doSomeWork() 
{ 
    //do what you want here.. 
    backgroundWorker.ReportProgress(yourprogresspercentagenumber); 
    //do what you want again.. 
    backgroundWorker.ReportProgress(yourprogresspercentagenumber); 
} 
+0

Wer ändert den Status des Fortschrittsbalkens? –

+0

@testtest sehe mein Update. Sie können den Wert für den Berichtsfortschritt in der 'doSomeWork'-Funktion festlegen. – currarpickt

+0

Sie haben Recht, ich habe bereits versucht, es war Fortschritt in progrss Balken zeigen, aber das Problem mit dieser Art zu erreichen ist, Meine Form soll sich verstecken (This.hide()) und Popup ein anderes Formular in DoSomething() -Funktion aber der Fortschrittsbalken endet zu 100%, selbst wenn ich "backgroundWorker.ReportProgress (100, null)"; nach form2.showdialog(); aber das form2 nie Popups –

2

Sie mischen hier zwei Konzepte. Bitte entscheiden Sie, ob Sie einen Timer oder einen Hintergrundarbeiter verwenden möchten.

Der Grund, warum nichts passiert, ist, dass Ihr nichts tut. So wird der Hintergrundarbeiter sofort beendet und backgroundWorker_RunWorkerCompleted wird aufgerufen, den Timer erneut anhalten.

backgroundWorker_ProgressChanged nie aufgerufen wird, denn das Ereignis nur, wenn Sie backgroundWorker.ReportProgress() nennen angehoben wird (und backgroundWorker.ReportsProgress Satz true haben).

Ich denke, die Arbeit, die Sie in doSomeWork() tun, sollte in backgroundWorker_DoWork durchgeführt werden, während der Fortschritt berichtet. Versuchen Sie etwas wie folgt:

private void btnOk_Click(object sender, EventArgs e) 
{ 
    progressBar.Visible = true; 
    backgroundWorker.ReportsProgress = true; 
    backgroundWorker.RunWorkerAsync(); 
} 

private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e) 
{ 
    doALittleWork(); 
    backgroundWorker.ReportProgress(10, null); 
    doMoreWork(); 
    backgroundWorker.ReportProgress(20, null); 
    //... 
    doLastWork(); 
    backgroundWorker.ReportProgress(100, null); 
} 

private void backgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
{ 
    progressBar.Visible = false; 
} 

private void backgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e) 
{ 
    progressBar.Value = e.ProgressPercentage; 
} 

Dies sollte tun, was Sie wollen. Der Timer wird in diesem Szenario nicht benötigt.

+0

Danke Rene ... wie würdest du es machen, wenn du dasselbe erreichen musst? Bitte erläutern Sie durch Kommentare. Ich danke dir sehr. –

+0

@testtest aktualisiert gerade meine Antwort. –

+0

Sie haben Recht, ich habe bereits versucht, es zeigte Fortschritt in Progrss-Leiste, aber das Problem mit dieser Art zu erreichen ist, Meine Form soll sich verstecken (This.hide()) und Popup ein anderes Formular in DoSomething() -Funktion aber der Fortschrittsbalken endet zu 100%, selbst wenn ich "backgroundWorker.ReportProgress (100, null)"; nach form2.showdialog(); aber das form2 nie Popups. –