2016-08-22 2 views
0

Also habe ich einen einfachen Mp3 zu Wave Konverter mit NAudio gemacht. Alles funktioniert gut, außer dass es einen Fehler gibt, den ich wirklich nicht mag. Hier ist der Abschnitt des Codes, der die Konvertierung tut:C# WinForm Fortschrittsbalken steigt nicht progressiv

foreach (mp3file file in fileList){ 
     string outputfilename = fbd.SelectedPath + "\\" + file.name + ".wav"; 
     using (Mp3FileReader reader = new Mp3FileReader(file.path)){ 
      using (WaveStream convertedStream = WaveFormatConversionStream.CreatePcmStream(reader)){ 
       WaveFileWriter.CreateWaveFile(outputfilename, convertedStream); 
      } 
     } 
     progressBar.PerformStep(); //This isn't working. 
    } 

ich das Programm machen wollte führen die progressbar einen Schritt jedes Mal, wenn ein Song umgewandelt wird, sondern der Fortschrittsbalken bleibt leer für den gesamten Umwandlungsprozess und dann erhöht sich alle auf einmal, wenn die Konvertierung abgeschlossen ist. Es ist nicht so besorgniserregend, wenn es keine einfache Lösung gibt, werde ich diesen Fehler tragen.

+0

becuase 'progressBar.PerformStep() auf der Aktualisierung;' hat in der Schleife sein, anstatt außerhalb der Schleife. Schneide und füge einen Schritt vorher ein. –

+0

Ich kann nicht glauben, dass ich das verpasst habe ... –

+0

Nein, warte, ich habe nur schlecht den Code in der Post kopiert, ich werde es beheben, 'progressBar.PerformStep()' ist in der Tat in der Schleife. –

Antwort

0

Ihre Conversion und progressbar updation am selben Thread nimmt so die GUI-Komponenten Aktualisierung nicht stattfinden, bis die Umwandlung nur Application.doEvents() verwendet abgeschlossen ist, wie es alle anstehenden Nachrichten in que der Anwendung nach progressbar.PerformStep() verarbeiten wird, dann wird es nicht füllen auf einmal am Ende der Bearbeitung, sondern hält mit der Verarbeitung

foreach (mp3file file in fileList){ 
     string outputfilename = fbd.SelectedPath + "\\" + file.name + ".wav"; 
     using (Mp3FileReader reader = new Mp3FileReader(file.path)){ 
      using (WaveStream convertedStream = WaveFormatConversionStream.CreatePcmStream(reader)){ 
       WaveFileWriter.CreateWaveFile(outputfilename, convertedStream); 
      } 
     } 
     progressBar.PerformStep(); //This isn't working alone 
     Application.DoEvents(); //This is working fine now 
    } 
+0

Dies funktionierte wie ein Charme. Danke vielmals. –

1

Sie sollten entweder BackgroundWorker oder async and await verwenden, um Aktualisierungen des Fortschrittsbalkens durchzuführen. Die Schleifen blockieren im Allgemeinen die WinForms und es sieht so aus, als wäre es eingefroren und nichts passiert. Während die BackgroundWorker den UI-Thread meldet, wenn Änderungen vorgenommen wurden.

im Konstruktor

{ 
    backgroundWorker.RunWorkerAsync(); 
} 

Background Umsetzung

private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e) 
{ 
    var backgroundWorker = sender as BackgroundWorker; 
    foreach (mp3file file in fileList) 
    { 
     string outputfilename = fbd.SelectedPath + "\\" + file.name + ".wav"; 
     using (Mp3FileReader reader = new Mp3FileReader(file.path)) 
     { 
      using (WaveStream convertedStream = WaveFormatConversionStream.CreatePcmStream(reader)){ 
      WaveFileWriter.CreateWaveFile(outputfilename, convertedStream); 
     } 
     backgroundWorker.ReportProgress(); 
    } 
} 

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

private void backgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
{ 
    // Do something When the loop or operation is completed. 
} 
+0

Ich muss etwas darüber nachforschen, es ist wirklich etwas, das ich nie benutzt habe und ich verstehe nicht, wie ich es umsetzen soll. Zum Beispiel, wann wird 'backgroundWorker_doWork (...)' aufgerufen? –

+0

In der ersten Zeile der Antwort ist der Link, wo Sie mehr über BackgroundWorker finden können. Als nächstes müssen Sie 'dowork' aufrufen, wenn Sie möchten, dass die Schleife für Sie implementiert wird. –

+0

Ich denke, ich habe es implementiert, wie Sie sagten, aber es wirft einige Cross-Thread-Ausnahme an der 'foreach' Linie –

0

Unter der Annahme, dass dies alles stattfindet, auf dem UI-Thread ist, versuchen, die Refresh() Methode auf dem Fortschrittsbalken Aufruf Objekt, um es zum Neuzeichnen zu zwingen.

foreach (mp3file file in fileList){ 
     string outputfilename = fbd.SelectedPath + "\\" + file.name + ".wav"; 
     using (Mp3FileReader reader = new Mp3FileReader(file.path)){ 
      using (WaveStream convertedStream = WaveFormatConversionStream.CreatePcmStream(reader)){ 
      WaveFileWriter.CreateWaveFile(outputfilename, convertedStream); 
     } 
     progressBar.PerformStep(); // This isn't working. 
     progressBar.Refresh();  // This might fix it 
    } 

Aber es ist besser, diese Art von Arbeit zu einem BackgroundWorker zu entladen.