我需要同时下载几个MP3文件,每个文件大概20M左右。
于是我做了一个程序,可以同时下载这几个文件(2~20个不等)
用for来循环下载,但是问题出现了,下载第一个文件的时候没有任何的问题,但是下载第二个文件的时候就会出错。
request.GetResponse() 操作超时下面是代码,有点儿乱
private void StartDownload()
{
WebClient client = new WebClient();
Point p;
long totalbytes;
int PID = 0;// ProgramID;
int RID = 0;//RowID;
long lStartPos = 0;
String FileName = string.Empty;
String TW = String.Empty;
FileStream fs;
//HttpWebRequest request;
Stream stream;
String ferer;
byte[] mbyte = new byte[10000];
int allmybyte = mbyte.Length;
long nowFinish = 0;
int m = 0;
double i = 0;
//HttpWebResponse response ; for (int k = 0; k < dataGridView1.RowCount; k++)
{
RID = k;
PID = Convert.ToInt32(dataGridView1.Rows[k].Cells[2].Value.ToString());
dataGridView1.Rows[k].DefaultCellStyle.BackColor = System.Drawing.Color.Blue;
Url = "http://localhost:1273/NewMedia/Operration/downMP3.aspx?UID=" + getHardInfo.userId.ToString() + "&AID=" + getHardInfo.ActiveId.ToString() + "&PID=" + PID.ToString();
FileName = this.dataGridView1.Rows[RID].Cells[0].Value.ToString();
TW = ToWhere + @"\" + FileName + ".mp3";
if (System.IO.File.Exists(TW))
{
fs = System.IO.File.OpenWrite(TW);
lStartPos = fs.Length;
fs.Seek(lStartPos, System.IO.SeekOrigin.Current); //移动文件流中的当前指针
}
else
{
fs = new System.IO.FileStream(TW, System.IO.FileMode.Create);
lStartPos = 0;
} HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(Url);
request.Timeout = 4000;
client.OpenRead(Url);
totalbytes = Convert.ToInt64(client.ResponseHeaders["Content-Length"]);
client.Dispose();
try
{
if (lStartPos < totalbytes)
{
if (lStartPos > 0)
{
request.AddRange((int)lStartPos);
}
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
stream = response.GetResponseStream(); ferer = request.Headers.ToString();
nowFinish = 0; m = stream.Read(mbyte, 0, allmybyte);
nowFinish = nowFinish + lStartPos;
i = 0;
while (nowFinish < totalbytes || m > 0)
{
//progressBar1.Value = Convert.ToInt32(nowFinish);
fs.Write(mbyte, 0, m);
nowFinish += m;
//ouput(nowFinish);
i = (double)(nowFinish * 100) / totalbytes;
this.dataGridView1.Rows[RID].Cells[3].Value = i.ToString() + "%";
m = stream.Read(mbyte, 0, allmybyte);
}
response.Close();
fs.Close();
stream.Close();
fs.Dispose();
stream.Dispose();
}
}
catch (WebException ex)
{
MessageBox.Show(ex.ToString());
} if (request != null)
{
request.Abort();
request = null;
}
}
MessageBox.Show("下载完毕"); }
于是我做了一个程序,可以同时下载这几个文件(2~20个不等)
用for来循环下载,但是问题出现了,下载第一个文件的时候没有任何的问题,但是下载第二个文件的时候就会出错。
request.GetResponse() 操作超时下面是代码,有点儿乱
private void StartDownload()
{
WebClient client = new WebClient();
Point p;
long totalbytes;
int PID = 0;// ProgramID;
int RID = 0;//RowID;
long lStartPos = 0;
String FileName = string.Empty;
String TW = String.Empty;
FileStream fs;
//HttpWebRequest request;
Stream stream;
String ferer;
byte[] mbyte = new byte[10000];
int allmybyte = mbyte.Length;
long nowFinish = 0;
int m = 0;
double i = 0;
//HttpWebResponse response ; for (int k = 0; k < dataGridView1.RowCount; k++)
{
RID = k;
PID = Convert.ToInt32(dataGridView1.Rows[k].Cells[2].Value.ToString());
dataGridView1.Rows[k].DefaultCellStyle.BackColor = System.Drawing.Color.Blue;
Url = "http://localhost:1273/NewMedia/Operration/downMP3.aspx?UID=" + getHardInfo.userId.ToString() + "&AID=" + getHardInfo.ActiveId.ToString() + "&PID=" + PID.ToString();
FileName = this.dataGridView1.Rows[RID].Cells[0].Value.ToString();
TW = ToWhere + @"\" + FileName + ".mp3";
if (System.IO.File.Exists(TW))
{
fs = System.IO.File.OpenWrite(TW);
lStartPos = fs.Length;
fs.Seek(lStartPos, System.IO.SeekOrigin.Current); //移动文件流中的当前指针
}
else
{
fs = new System.IO.FileStream(TW, System.IO.FileMode.Create);
lStartPos = 0;
} HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(Url);
request.Timeout = 4000;
client.OpenRead(Url);
totalbytes = Convert.ToInt64(client.ResponseHeaders["Content-Length"]);
client.Dispose();
try
{
if (lStartPos < totalbytes)
{
if (lStartPos > 0)
{
request.AddRange((int)lStartPos);
}
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
stream = response.GetResponseStream(); ferer = request.Headers.ToString();
nowFinish = 0; m = stream.Read(mbyte, 0, allmybyte);
nowFinish = nowFinish + lStartPos;
i = 0;
while (nowFinish < totalbytes || m > 0)
{
//progressBar1.Value = Convert.ToInt32(nowFinish);
fs.Write(mbyte, 0, m);
nowFinish += m;
//ouput(nowFinish);
i = (double)(nowFinish * 100) / totalbytes;
this.dataGridView1.Rows[RID].Cells[3].Value = i.ToString() + "%";
m = stream.Read(mbyte, 0, allmybyte);
}
response.Close();
fs.Close();
stream.Close();
fs.Dispose();
stream.Dispose();
}
}
catch (WebException ex)
{
MessageBox.Show(ex.ToString());
} if (request != null)
{
request.Abort();
request = null;
}
}
MessageBox.Show("下载完毕"); }
{
request.Abort();
request = null;
}你试着把这句话放到你每个循环里试试看。
request.AllowAutoRedirect = true;
request.Timeout =60000; //ms
试着把这几个属性这么设置下看看。
你debug,在调试时拿到第二个mp3的连接后,放到ie里去试下,看行不。
还有一个做法是,你每次把request变量Abort掉,并且等于null。包括response,全部这样后,
然后调用GC.Collect()试下在IO操作时经常会出现句柄在内存中没释放掉的情况。我估计连接也一样的。
GC.Collect()了也不行
谢谢你的回复!
没有时间问题,只要是下载第2个,就会出错,而第二个的链接是绝对存在的。
后来我想是不是由于cookies的问题,所以每次request的时候就给他 new CookieContainer()。结果还真的是这个原因。
request.CookieContainer = new CookieContainer();
后来我想是不是由于cookies的问题,所以每次request的时候就给他 new CookieContainer()。结果还真的是这个原因。
request.CookieContainer = new CookieContainer();
【已解决】HttpWebRequest的GetResponse偶尔超时
http://www.crifan.com/2012/02/16/fixed_problem_sometime_httpwebrequest_getresponse_timeout/
【已解决】HttpWebRequest的GetResponse偶尔超时
http://www.crifan.com/2012/02/16/fixed_problem_sometime_httpwebrequest_getresponse_timeout/