问题描述
List<string>downURL=newList<string>();inturlCount=0;stringurl1="http://market.finance.sina.com.cn/downxls.php?date=2015-";stringurl2="&symbol=sh600030";stringsavePath=string.Format("{0}\Desktop\test\",Environment.GetEnvironmentVariable("USERPROFILE"));//函数把2015年1到2月份的下载url都添加到downURL这个List中去privatevoidGetUrlReady(){for(inti=1;i<=2;i++){stringtmp1=String.Empty;if(i<10){tmp1=string.Format("{0}0{1}-",url1,i);}else{tmp1=string.Format("{0}{1}-",url1,i);}for(intj=1;j<=31;j++){stringtmp2=String.Empty;if(j<10){tmp2=string.Format("{0}0{1}{2}",tmp1,j,url2);}else{tmp2=string.Format("{0}{1}{2}",tmp1,j,url2);}downURL.Add(tmp2);}}}//这个函数打算利用downloadfiletaskasync这个方法自动从List中取得URL,进行异步下载//并在所有下载完成以后,通知用户“下载完成”。privatelongTaskTestA(){Task[]t=newTask[downURL.Count];WebClient[]wc=newWebClient[downURL.Count];for(inti=0;i<downURL.Count;i++){inttmp=i;stringsp=savePath+"A\";t[tmp]=newTask(()=>{wc[tmp]=newWebClient();wc[tmp].DownloadFileTaskAsync(newUri(downURL[tmp]),string.Format("{0}{1}.txt",sp,tmp+1));});t[tmp].Start();}Task.WaitAll(t);MessageBox.show("全部完成");}privatevoidbutton1_Click(objectsender,EventArgse){downURL.Clear();Directory.CreateDirectory(savePath+"A");GetUrlReady();TaskTestC();}
但实际的运行结果是弹出“全部完成”的时候,其实后台还在下载。我试图在TaskTestA方法前添加async,并把其中的Task.WaitAll(t);改成awaitTask.whenall(t);,但是也是不行。脑袋一头浆糊,请前辈们和高手点拨。Task我刚接触,请前辈们该骂的骂,我试图采用如下的方法,但不知道如何改造适合我的实验项目,publicasyncTaskRunAsync(){IEnumerable<string>urls=File.ReadAllLines(@"c:/temp/Input/input.txt");varurlTasks=urls.Select((url,index)=>{WebClientwc=newWebClient();stringpath=string.Format("{0}image-{1}.jpg",@"c:/temp/Output/",index);vardownloadTask=wc.DownloadFileTaskAsync(newUri(url),path);Output(path);returndownloadTask;});Console.WriteLine("Startnow");awaitTask.WhenAll(urlTasks);Console.WriteLine("Done");}