private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
for (int i = 1; i <= lines.Length; i++)
{
if (lines[i].Contains("Code"))
{
string countryCode = lines[i].Substring(15);
using (var client = new WebClient())
{
client.DownloadFileCompleted += Client_DownloadFileCompleted;
Uri uri = new Uri("http://api.sat24.com/animated/" + countryCode + "/infraPolair/1/JerusalemStandardTime/1897199");
client.DownloadFile(uri, @"c:\temp\" + countriesNames[countCountries] + ".gif");
}
backgroundWorker1.ReportProgress(i * 100 / lines.Length);
countCountries++;
}
}
}
private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
progressBar1.Value = e.ProgressPercentage;
label1.Text = e.ProgressPercentage.ToString() + "%";
}
所有的GIF都会下载很好,但会保持97%。我可以在backgroundworker完成事件中将progressBar值设置为100,但这不是我认为的真正解决方案。
另一个问题是如何处理下载的第一个gif?它是GIF动画,我希望一旦下载第一个,就可以在pictureBox1中显示它。我应该使用WebClient下载完成事件吗?
答案 0 :(得分:3)
您的代码将在此处的最后一次迭代中抛出异常。你可能没有意识到这一点。
for (int i = 1; i <= lines.Length; i++)
因为您必须从0
迭代到i < lines.Length
。 (注意,数组索引是从0开始的)
for (int i = 0; i < lines.Length; i++)
并将报告进度更改为此
backgroundWorker1.ReportProgress(i * 100 / (lines.Length - 1));
我错过了@Peter在回答中提到的另一个注意事项是将报告进度线移到if语句之外。
if (lines[i].Contains("Code") {...}
backgroundWorker1.ReportProgress(i * 100 / (lines.Length-1));
答案 1 :(得分:1)
你的进步在你的内心。将它放在if之外,它将报告正确的过程。我想最后几行不包含单词Code:
for (int i = 0; i < lines.Length; i++)
{
if (lines[i].Contains("Code"))
{
string countryCode = lines[i].Substring(15);
using (var client = new WebClient())
{
client.DownloadFileCompleted += Client_DownloadFileCompleted;
Uri uri = new Uri("http://api.sat24.com/animated/" + countryCode + "/infraPolair/1/JerusalemStandardTime/1897199");
client.DownloadFile(uri, @"c:\temp\" + countriesNames[countCountries] + ".gif");
}
countCountries++;
}
backgroundWorker1.ReportProgress(i * 100 / (lines.Length-1));
}
答案 2 :(得分:-1)
我可以专注于100 / lines.Length
。试试(double)100 / (double)lines.Length