我有一个WinForms应用程序,它使用后台工作程序从给定的URL下载图像。为了下载,我使用了一个后台工作者。 启动时应用程序运行正常,下载按计划进行,但是当工作人员完成并再次单击下载按钮以开始从另一个URL下载时,后台工作人员不会执行任何操作。
我在工作完成时调用application.restart()暂时解决了这个问题,但是工作时间不长,但是不能超过它。
工人码:
// initialization of worker is done in constructor of my class
downloadWorker.WorkerReportsProgress = true;
downloadWorker.WorkerSupportsCancellation = true;
downloadWorker.DoWork += new DoWorkEventHandler(worker_doWork);
downloadWorker.ProgressChanged += new ProgressChangedEventHandler(worker_progressChanged);
downloadWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker_runWorkerCompleted);
// ...
private void worker_doWork(object sender, DoWorkEventArgs e)
{
WebClient downloadClient = new WebClient();
HttpWebRequest HttpReq = (HttpWebRequest)WebRequest.Create(url);
HttpWebResponse response;
try
{
response = (HttpWebResponse)HttpReq.GetResponse();
}
catch (WebException ex)
{
response = (HttpWebResponse)ex.Response;
}
if (response.StatusCode == HttpStatusCode.NotFound)
MessageBox.Show("Website not found");
if (response.StatusCode == HttpStatusCode.OK)
{
for(int i=0; i<3;i++)
{
string image = getImageUrl(url,i);
downloadWorker.ReportProgress(i);
image = WebUtility.HtmlDecode(image);
string saveName = "img_"+i+".png";
try
{
downloadClient.DownloadFile(image, saveName);
}
catch (Exception ex)
{
MessageBox.Show(ex.StackTrace);
}
}
}
}
private void worker_progressChanged(object sender, ProgressChangedEventArgs e)
{
rtxtStatus.AppendText("Downloade Image" + e.ProgressPercentage + " of 3");
}
private void worker_runWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
MessageBox.Show("Download completed");
}
编辑:
if (e.Error != null)
{
MessageBox.Show(e.Error.ToString());
}
为了避免任何误解:backgroundWorker在第二次定义运行,并且它不是reportProgress方法的错误,因为当我不报告任何内容时我得到相同的东西。
编辑没有。 2:
我发现错误来自哪里:在第二次运行时,完全跳过for循环。但这对我来说也没有任何意义......因为我有一个全新的类实例,所以还没有任何其他价值,是吗?但无论如何,如果它只是跳过了方法,那么工人仍然应该退出它不做的事情。为了测试,我在for循环之后添加了一个MessageBox,它在第二次运行后没有执行。