求助:读取网络文件失败,返回“远程主机强迫关闭了一个现有连接”

lywtututu 2014-11-18 10:16:42
我的函数需要遍历下载100个YAHOO股票文件,但是如果当前股票停盘,如果我读取这个股票的文件则提示“远程主机强迫关闭了一个现有连接”,如果继续循环往下遍历走的话,则失败,必须等待几十秒的超时后,才能继续进行FOR循环下载,请问这种问题如何解决?
下面的代码,600317可以下载,但是600318现在停盘,下载数据会死掉

下面是代码:

private void button2_Click_1(object sender, EventArgs e)
{
string strUri;
string filename;
WebClient wc = new WebClient();

//download 600317--600417
for (int i = 600317; i <= 600417; i++)
{
try
{
//read the data from 2014-7-1 to 2014-9-11
strUri = "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 (Exception ee)
{
MessageBox.Show("failed 2");
}
}

MessageBox.Show("download success");
}

private void DownLoadFile(string OriUri, string filename)
{
Stream str;
FileStream fstr;
WebClient client = new WebClient();
byte[] mbyte = new byte[100000];
int allmybyte = 0, startmbyte = 0;

try
{
str = client.OpenRead(OriUri);

allmybyte = (int)mbyte.Length;
startmbyte = 0;

while (allmybyte > 0)
{
int m = str.Read(mbyte, startmbyte, allmybyte);
if (0 == m)
{
break;
}

startmbyte += m;
allmybyte -= m;
}

fstr = new FileStream(filename, FileMode.OpenOrCreate, FileAccess.Write);
fstr.Write(mbyte, 0, startmbyte);

fstr.Flush();
fstr.Close();
str.Close();
}
catch (Exception o)
{
MessageBox.Show(o.Message);
return;
}

client.Dispose();
}
...全文
327 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
by_封爱 版主 2014-11-25
  • 打赏
  • 举报
回复

System.Threading.Tasks.Parallel.For(600317, 600417, (i) => {
                var  w = new WebClient();
                var url = "http://table.finance.yahoo.com/table.csv?a=6&b=1&c=2014&d=8&e=11&f=2014&s=600" + i.ToString() + ".ss";
                var filename = "D:\\" + i.ToString() + ".csv";
                var b = w.DownloadData(url);
                using (FileStream fs = new FileStream(filename, FileMode.OpenOrCreate, FileAccess.Write))
                {
                    fs.Write(b, 0, b.Length);
                    fs.Flush();
                    fs.Close();
                }
            });
简单的写了下 没有测试..不过就是这个思路... 其中 DownloadData也是有异步的..你可以看下...(因为没用过DownloadDataAsync 所以不敢乱写....)
by_封爱 版主 2014-11-25
  • 打赏
  • 举报
回复
for本身是同步的..你可以使用Parallel.for 其次
江南小鱼 2014-11-25
  • 打赏
  • 举报
回复
你的代码单线循环,一次下载完成后再执行下一次下载,效率会很低 改成异步进行,多个线程并行下载
蒋晟 2014-11-24
  • 打赏
  • 举报
回复
函数? .Net 4.0以上用Task类
lywtututu 2014-11-19
  • 打赏
  • 举报
回复
用哪个并行函数?我是个菜鸟,还请多指教
蒋晟 2014-11-18
  • 打赏
  • 举报
回复
把下载股票的操作改为并行执行

110,529

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧