如果您选择使用BackgroundWorker,它允许您在每次下载文件时将这些消息输出到文本框。这是一个适合您要求的粗略示例。
1) 在类级别,创建 BackgroundWorker 类的实例,并将事件处理程序添加到 BackgroundWorker 实例的事件中:
BackgroundWorker workerDownload = new BackgroundWorker();
workerDownload.WorkerReportsProgress = true;
workerDownload.DoWork += workerDownload_DoWork;
workerDownload.ProgressChanged += workerDownload_ProgressChanged;
workerDownload.RunWorkerCompleted += workerDownload_RunWorkerCompleted;
2) 为后台工作人员的 DoWork 事件创建事件处理程序:
DoWork 事件处理程序是您运行耗时操作的地方
在后台线程上。传递给后台的任何值
操作在 DoWorkEventArgs 的 Argument 属性中传递
传递给事件处理程序的对象。
private void workerDownload_DoWork(object sender, DoWorkEventArgs e)
{
foreach (var ticker in tickers)
{
// you can pass the required info as argument:
string[] arrArg = (string[])e.Argument;
string theUrl = arrArg[0];
string directory = arrArg[1];
var url = string.Format(theUrl, ticker);
var csvfile = directory + "\\" + ticker.ToUpper() + ".csv";
// perform the download operation and report progress:
workerDownload.ReportProgress(0, "Starting Download of : " + ticker + "\n");
webClient.DownloadFile(url, csvfile);
workerDownload.ReportProgress(100, "End Download of : " + ticker + "\n");
numStocks++;
}
}
3) 为后台工作人员的 ProgressChanged 事件创建事件处理程序:
在 ProgressChanged 事件处理程序中,添加代码以指示
进度,例如更新用户界面。
private void workerDownload_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
tbOutput.Text += e.UserState.ToString();
}
4) 为 RunWorkerCompleted 事件创建事件处理程序:
RunWorkerCompleted 事件在后台工作人员完成时引发
完成。
private void workerDownload_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
tbOutput.Text += "Total stocks downloaded = " + numStocks + "\n";
}
5) 通过调用 RunWorkerAsync 方法开始运行后台操作:
int numStocks = 0;
string strDirectory = "<a_directory>";
string strUrl = string.Format(urlPrototype, startMonth, startDay, startYear, finishMonth, finishDay, finishYear, "d");
string[] args = new string[2] { strUrl, strDirectory };
workerDownload.RunWorkerAsync(args);