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

时间:2016-08-22 01:41:01

标签: c# .net winforms

所以我使用NAudio制作了一个简单的Mp3到Wave转换器。一切都很好,除了有一个我真的不喜欢的错误。以下是执行转换的代码部分:

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

我希望程序在每次转换歌曲时让进度条执行一个步骤,但是进度条在整个转换过程中保持为空,然后在转换完成后立即增加所有内容。 这并不令人担心,如果没有简单的解决方案我会承担这个错误。

3 个答案:

答案 0 :(得分:1)

您应该使用BackgroundWorkerasync and await执行进度条更新。循环通常会阻止WinForms,看起来它已经冻结,没有任何事情发生。而foo=# insert into tag (name, version, description, active) values ("scala", 1, "programming language", true); ERROR: column "scala" does not exist LINE 1: ... tag (name, version, description, active) values ("scala", 1... 报告UI线程,如果有任何更改。

在构造函数

BackgroundWorker

BackgroundWorker实施

{
    backgroundWorker.RunWorkerAsync();
}

答案 1 :(得分:0)

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

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

但最好将此类工作卸载到BackgroundWorker。

答案 2 :(得分:0)

您的转换和进度条更新发生在同一个线程上,因此在转换完成之前不会更新GUI组件只需使用Application.doEvents(),因为它将在{{1}之后处理应用程序中的所有待处理消息那么它在处理结束时不会立即填满,而是继续使用处理进行更新

progressbar.PerformStep()