需要使用webclient报告进度 [英] Need to report progress using webclient

查看:55
本文介绍了需要使用webclient报告进度的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

应用程序异步下载多个文件,所以当我输入10个链接到列表框10个文件开始下载。我想为每个文件动态创建进度条并报告进度。这就是我用来报告进度的内容

The app downloading multiple files asynchronously, so when i enter 10 links into listbox 10 files start to download. I wast to create progress bars dynamically for every file and report progress. This is what im using to report progress

client.DownloadProgressChanged += new DownloadProgressChangedEventHandler(worker_ProgressChanged);

但它无效。

当我做

but its not working.
When i do

worker.ReportProgress(10);



它有效,但我只能报告一个整数,而不是client.DownloadProgressChanged。

我的问题是如何将client.DownloadProgressChanged附加到我的worker_ProgressChanged类。



我尝试过:



private void backgroundWorker1_DoWork(object sender,DoWorkEventArgs e)

{





List< string> myList =(List< string>)e.Argument;



foreach(myList中的字符串yo)

{

ProgressBar bar = new ProgressBar();

位置+ = 30;

bar.Width = 300;



bar.Location = new Point(300,po​​sition);



Invoke(new ToDoDelegate(()=> bar.Location = new Point(150, position)));

Invoke(new ToDoDelegate(()=> this.Controls.Add(bar)));

Invoke(new ToDoDelegate(()= > bar.Visible = true));





WebClient客户端=新WebClient();



string FileName = yo.Substring(yo.LastIndexOf(/)+ 1,(yo.Length - yo.LastIndexOf(/) - 1));

client.DownloadFileAsync(new Uri(yo),C:\\Test4 \\+ FileName);



client.DownloadProgressChanged + = new DownloadProgressChangedEventHandler(worker_ProgressChanged);





//(发件人为BackgroundWorker).ReportProgress((client.DownloadFileAsync(new Uri(yo),FileName)));

worker.ReportProgress(10);

}



}



private void worker_ProgressChanged(object sender,ProgressChangedEventArgs e)

{< br $>




MessageBox.Show(我正在报告);

}


it works but im can only report an integer and not client.DownloadProgressChanged.
My question is how do i attach client.DownloadProgressChanged to my worker_ProgressChanged class.

What I have tried:

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{


List<string> myList = (List<string>)e.Argument;

foreach(string yo in myList)
{
ProgressBar bar = new ProgressBar();
position += 30;
bar.Width = 300;

bar.Location = new Point(300, position);

Invoke(new ToDoDelegate(() => bar.Location = new Point(150, position)));
Invoke(new ToDoDelegate(() => this.Controls.Add(bar)));
Invoke(new ToDoDelegate(() => bar.Visible = true));


WebClient client = new WebClient();

string FileName = yo.Substring(yo.LastIndexOf("/") + 1, (yo.Length - yo.LastIndexOf("/") - 1));
client.DownloadFileAsync(new Uri(yo), "C:\\Test4\\" + FileName);

client.DownloadProgressChanged += new DownloadProgressChangedEventHandler(worker_ProgressChanged);


// (sender as BackgroundWorker).ReportProgress((client.DownloadFileAsync( new Uri(yo), FileName)));
worker.ReportProgress(10);
}

}

private void worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{


MessageBox.Show("I am reporting");
}

推荐答案

以下代码将对您有所帮助:



The following code will help you:

WebClient webClient = new WebClient();
webClient.DownloadProgressChanged += new DownloadProgressChangedEventHandler(webClient_DownloadProgressChanged);
webClient.DownloadFileCompleted += new AsyncCompletedEventHandler(DownloadFileCompleted);
webClient.QueryString.Add("file", localFilePath); // To identify the file 
webClient.DownloadFileAsync("URL here", localFilePath);





webClient_DownloadProgressChanged 事件将如下所示:





And the webClient_DownloadProgressChanged event will be like the following:

void webClient_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e)
{
    string fileProcessed = ((System.Net.WebClient)(sender)).QueryString["file"]; // Getting the local path if required       
    var RecevedBytes = e.BytesReceived;
    var TotalBytes = e.TotalBytesToReceive;
    // use these variables if needed
    bar.Value = e.ProgressPercentage;        

}


这篇关于需要使用webclient报告进度的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆