从后台工作者获取错误值的进度
我是 C# 新手,我仍在努力学习。
我已经为从 ftp 下载文件时的进度条编写了这段代码,它实际上工作得很好。但进度值是完全错误的。它看起来像是字节值。但奇怪的是,当我将值打印到屏幕上时,它会打印正确的值。
private void frm_movie_db_Load(object sender, EventArgs e)
{
if (!File.Exists("movies.list.gz"))
{
bg_worker.RunWorkerAsync();
}
}
private void bg_worker_DoWork(object sender, DoWorkEventArgs e)
{
string strDownloadFrom = "ftp://ftp.sunet.se/pub/tv+movies/imdb/movies.list.gz";
string strDownloadTo = "movies.list.gz";
try
{
FtpWebRequest request = (FtpWebRequest)WebRequest.Create(strDownloadFrom);
request.Method = WebRequestMethods.Ftp.GetFileSize;
request.Credentials = new NetworkCredential("anonymous", "");
request.UsePassive = true;
request.UseBinary = true;
request.KeepAlive = true;
Int64 intFileSize = request.GetResponse().ContentLength;
Int64 intRunningByteTotal = 0;
request = (FtpWebRequest)FtpWebRequest.Create(strDownloadFrom);
request.Method = WebRequestMethods.Ftp.DownloadFile;
request.Credentials = new NetworkCredential("anonymous", "");
request.UsePassive = true;
request.UseBinary = true;
request.KeepAlive = false;
FtpWebResponse response = (FtpWebResponse)request.GetResponse();
Stream reader = response.GetResponseStream();
Stream writer = new FileStream(strDownloadTo, FileMode.Create, FileAccess.Write, FileShare.None);
byte[] byteBuffer = new byte[1024];
int intByteSize = 0;
int intProgressPct = 0;
while ((intByteSize = reader.Read(byteBuffer, 0, byteBuffer.Length)) > 0)
{
if (intByteSize == 0)
{
intProgressPct = 100;
bg_worker.ReportProgress(intProgressPct);
}
else
{
writer.Write(byteBuffer, 0, intByteSize);
if (intByteSize + intRunningByteTotal <= intFileSize)
{
intRunningByteTotal += intByteSize;
double dIndex = intRunningByteTotal;
double dTotal = byteBuffer.Length;
double dProgressPct = (double)(dIndex / dTotal);
intProgressPct = (int)dProgressPct;
bg_worker.ReportProgress(intProgressPct);
}
}
}
//reader.Close();
//mem_stream.Close();
//response.Close();
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
}
private void bg_worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
//pb_download_files.Value = e.ProgressPercentage;
lbl_progress_pct.Text = e.ProgressPercentage.ToString() + "%";
}
private void bg_worker_RunWorkerComplete(object sender, RunWorkerCompletedEventArgs e)
{
pnlProgress.Visible = false;
}
我希望有人可以帮助我解决这个问题,因为到目前为止我已经尽了一切努力来解决这个问题。
此致 杰斯珀
I'm new in c# and i'm still working way through and learning it all.
I have made this code for a progress bar when downloading a file from ftp, and it actually working just fine. But progress value is all wrong. It looks like it is byte value somehow. But the weird thing is when I print the value to the screen, then it prints the correct value.
private void frm_movie_db_Load(object sender, EventArgs e)
{
if (!File.Exists("movies.list.gz"))
{
bg_worker.RunWorkerAsync();
}
}
private void bg_worker_DoWork(object sender, DoWorkEventArgs e)
{
string strDownloadFrom = "ftp://ftp.sunet.se/pub/tv+movies/imdb/movies.list.gz";
string strDownloadTo = "movies.list.gz";
try
{
FtpWebRequest request = (FtpWebRequest)WebRequest.Create(strDownloadFrom);
request.Method = WebRequestMethods.Ftp.GetFileSize;
request.Credentials = new NetworkCredential("anonymous", "");
request.UsePassive = true;
request.UseBinary = true;
request.KeepAlive = true;
Int64 intFileSize = request.GetResponse().ContentLength;
Int64 intRunningByteTotal = 0;
request = (FtpWebRequest)FtpWebRequest.Create(strDownloadFrom);
request.Method = WebRequestMethods.Ftp.DownloadFile;
request.Credentials = new NetworkCredential("anonymous", "");
request.UsePassive = true;
request.UseBinary = true;
request.KeepAlive = false;
FtpWebResponse response = (FtpWebResponse)request.GetResponse();
Stream reader = response.GetResponseStream();
Stream writer = new FileStream(strDownloadTo, FileMode.Create, FileAccess.Write, FileShare.None);
byte[] byteBuffer = new byte[1024];
int intByteSize = 0;
int intProgressPct = 0;
while ((intByteSize = reader.Read(byteBuffer, 0, byteBuffer.Length)) > 0)
{
if (intByteSize == 0)
{
intProgressPct = 100;
bg_worker.ReportProgress(intProgressPct);
}
else
{
writer.Write(byteBuffer, 0, intByteSize);
if (intByteSize + intRunningByteTotal <= intFileSize)
{
intRunningByteTotal += intByteSize;
double dIndex = intRunningByteTotal;
double dTotal = byteBuffer.Length;
double dProgressPct = (double)(dIndex / dTotal);
intProgressPct = (int)dProgressPct;
bg_worker.ReportProgress(intProgressPct);
}
}
}
//reader.Close();
//mem_stream.Close();
//response.Close();
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
}
private void bg_worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
//pb_download_files.Value = e.ProgressPercentage;
lbl_progress_pct.Text = e.ProgressPercentage.ToString() + "%";
}
private void bg_worker_RunWorkerComplete(object sender, RunWorkerCompletedEventArgs e)
{
pnlProgress.Visible = false;
}
I hope someone can help me with this, as i've done everything so far to fix the problem myself.
Best regards
Jesper
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
您对百分比进度计算完全错误:perc 必须是
100 x 当前/总计,因此您使用了错误的值。
尝试这样做:
阅读 Microsoft 文档:
其中 percentageProgress 是已完成的后台操作的百分比(从 0 到 100)。
You're completely mistaken on percentage progress calculation: perc must be
100 x current / total, so you're using wrong values.
Try with this:
Read Microsoft documentation:
where percentageProgress is the percentage, from 0 to 100, of the background operation that is complete.
不将总字节分配给 dTotal。 byteBuffer 是一个大小恒定为 1024 字节的缓冲区。尝试类似
检索流的字节长度。
Does not assign the total bytes to dTotal. byteBuffer is a buffer with a constant size of 1024 bytes. Try something like
to retrieve the length in bytes of the stream.
你有:
我想你想要:
you have:
I think you want: