c# WinForm进度条没有逐渐增加

本文关键字:增加 WinForm | 更新日期: 2023-09-27 18:03:24

所以我用NAudio做了一个简单的Mp3到Wave转换器。一切都很好,除了有一个bug,我真的不喜欢。下面是进行转换的代码部分:

    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.
    }

我希望程序使进度条每次转换歌曲时执行一个步骤,但是在整个转换过程中进度条保持空,然后在转换完成时立即增加。如果没有简单的解决方案,我愿意承担这个bug。

c# WinForm进度条没有逐渐增加

您应该使用BackgroundWorker或async并等待执行进度条更新。循环通常会阻塞WinForms,看起来就像被冻结了,什么也没发生。而BackgroundWorker则报告UI线程,如果有任何更改。

在构造函数 中
{
    backgroundWorker.RunWorkerAsync();
}

BackgroundWorker实施

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.
}

你的转换和进度条更新发生在同一个线程上,所以更新GUI组件不会发生,直到转换完成才使用Application.doEvents(),因为它将在progressbar.PerformStep()之后处理所有悬而未决的消息,然后它不会在处理结束时立即填充,而是继续更新处理

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
    }

假设这一切都发生在UI线程上,请尝试调用进度条对象的Refresh()方法,强制它重新绘制。

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
    }

但是最好把这类工作卸载给BackgroundWorker。