[英]C# Progress bar doesn't update while downloading
I am downloading a file from ftp server with a BackgroundWorker but the progress only updates when the file is already finished downloading. 我正在使用BackgroundWorker从ftp服务器下载文件,但是进度仅在文件已经完成下载时更新。
Progress bar stays at 0, freezes for the duration of download, and sets to 100. 进度栏保持为0,在下载期间冻结,并设置为100。
Here's my code: 这是我的代码:
private void backgroundWorker1_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e) {
FtpWebRequest request = (FtpWebRequest)WebRequest.Create(activeDownload.ftpPath);
request.Credentials = new NetworkCredential(ftpUser, ftpPass);
request.Method = WebRequestMethods.Ftp.DownloadFile;
FtpWebResponse response = (FtpWebResponse)request.GetResponse();
Stream responseStream = response.GetResponseStream();
using (FileStream writer = new FileStream(activeDownload.localPath, FileMode.Create)) {
long length = response.ContentLength;
int bufferSize = 2048;
int readCount;
byte[] buffer = new byte[2048];
long bytesread = 0;
backgroundWorker1.ReportProgress(0);
readCount = responseStream.Read(buffer, 0, bufferSize);
while (readCount > 0) {
bytesread += readCount;
writer.Write(buffer, 0, readCount);
backgroundWorker1.ReportProgress((int)(bytesread / activeDownload.fileSize) * 100);
readCount = responseStream.Read(buffer, 0, bufferSize);
}
}
response.Close();
responseStream.Close();
}
private void backgroundWorker1_ProgressChanged(object sender, System.ComponentModel.ProgressChangedEventArgs e) {
progressBar1.Value = e.ProgressPercentage;
}
What am I doing wrong? 我究竟做错了什么? Any help would be appreciated.
任何帮助,将不胜感激。
Set the value, then run below 设置值,然后在下面运行
progressbar1.PerformStep()
You can also do 你也可以
progressBar1.Refresh()
see if the following links helps: 查看以下链接是否有帮助:
From Stack and MSDN 从Stack和MSDN
Below is sample code what I have implemented in one of my projects: 以下是我在一个项目中实现的示例代码:
public ProcessFilesClass()
{
InitializeComponent();
backgroundWorker1= new BackgroundWorker();
backgroundWorker1.DoWork += new DoWorkEventHandler(backgroundWorker1_DoWork);
backgroundWorker1.RunWorkerCompleted += new RunWorkerCompletedEventHandler(backgroundWorker1_RunWorkerCompleted);
backgroundWorker1.ProgressChanged += new ProgressChangedEventHandler(backgroundWorker1_ProgressChanged);
}
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
BackgroundWorker worker = sender as BackgroundWorker;
var backgroundWorker = sender as BackgroundWorker;
worker.WorkerReportsProgress = true;
WorkerProcessMethod();
}
private void WorkerProcessMethod()
{
//Process items in list box
int itemsToProcess = someListBox.Items.Count;
for (int i = 0; i < itemsToProcess; i++)
{
int findPercentage = ((i + 1) * 100) / someListBox.Items.Count;
if (backgroundWorker1 != null) { backgroundWorker1.ReportProgress(findPercentage, null); }
}
}
private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
progressBar1.Value = e.ProgressPercentage;
}
private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
//DisableProgressBarStatus
this.Close();
}
Ok so it turned out that I was doing everything fine but I was parsing the percentage wrong. 好的,事实证明我做得很好,但是我解析的百分比错误。 Dividing two longs (bytesread and activeDownload.fileSize) was returning 0. Hence, the progress was stuck at 0%.
除以两个long(bytesread和activeDownload.fileSize)将返回0。因此,进度停留在0%。
Here is the correct parsing: 这是正确的解析:
backgroundWorker1.ReportProgress(Convert.ToInt32((((double)bytesread / activeDownload.fileSize) * 100)));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.