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。
您应该使用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。