问题描述
我的函数需要遍历下载100个YAHOO股票文件,但是如果当前股票停盘,如果我读取这个股票的文件则提示“远程主机强迫关闭了一个现有连接”,如果继续循环往下遍历走的话,则失败,必须等待几十秒的超时后,才能继续进行FOR循环下载,请问这种问题如何解决?下面的代码,600317可以下载,但是600318现在停盘,下载数据会死掉下面是代码:privatevoidbutton2_Click_1(objectsender,EventArgse){stringstrUri;stringfilename;WebClientwc=newWebClient();//download600317--600417for(inti=600317;i<=600417;i++){try{//readthedatafrom2014-7-1to2014-9-11strUri="http://table.finance.yahoo.com/table.csv?a=6&b=1&c=2014&d=8&e=11&f=2014&s=600"+Convert.ToString(i)+".ss";filename="D:\vs\csv\"+Convert.ToString(i)+".csv";DownLoadFile(strUri,filename);}catch(Exceptionee){MessageBox.Show("failed2");}}MessageBox.Show("downloadsuccess");}privatevoidDownLoadFile(stringOriUri,stringfilename){Streamstr;FileStreamfstr;WebClientclient=newWebClient();byte[]mbyte=newbyte[100000];intallmybyte=0,startmbyte=0;try{str=client.OpenRead(OriUri);allmybyte=(int)mbyte.Length;startmbyte=0;while(allmybyte>0){intm=str.Read(mbyte,startmbyte,allmybyte);if(0==m){break;}startmbyte+=m;allmybyte-=m;}fstr=newFileStream(filename,FileMode.OpenOrCreate,FileAccess.Write);fstr.Write(mbyte,0,startmbyte);fstr.Flush();fstr.Close();str.Close();}catch(Exceptiono){MessageBox.Show(o.Message);return;}client.Dispose();}
解决方案
解决方案二:
把下载股票的操作改为并行执行
解决方案三:
用哪个并行函数?我是个菜鸟,还请多指教
解决方案四:
函数?.Net4.0以上用Task类
解决方案五:
你的代码单线循环,一次下载完成后再执行下一次下载,效率会很低改成异步进行,多个线程并行下载
解决方案六:
for本身是同步的..你可以使用Parallel.for其次
解决方案七:
System.Threading.Tasks.Parallel.For(600317,600417,(i)=>{varw=newWebClient();varurl="http://table.finance.yahoo.com/table.csv?a=6&b=1&c=2014&d=8&e=11&f=2014&s=600"+i.ToString()+".ss";varfilename="D:\"+i.ToString()+".csv";varb=w.DownloadData(url);using(FileStreamfs=newFileStream(filename,FileMode.OpenOrCreate,FileAccess.Write)){fs.Write(b,0,b.Length);fs.Flush();fs.Close();}});
简单的写了下没有测试..不过就是这个思路...其中DownloadData也是有异步的..你可以看下...(因为没用过DownloadDataAsync所以不敢乱写....)