我需要同时下载几个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("下载完毕");        }

解决方案 »

  1.   

     if (request != null)
                        {
                            request.Abort();
                            request = null;
                        }你试着把这句话放到你每个循环里试试看。
      

  2.   

    request.KeepAlive = false;
    request.AllowAutoRedirect = true;
    request.Timeout =60000; //ms
    试着把这几个属性这么设置下看看。
      

  3.   

    特别是那个KeppAlive,设置为false。
      

  4.   

    谢谢tmxk2002,这些方式我都用过,KeepAlice也设成false了,但是没用
      

  5.   

    我觉得错误可能在你下载mp3的页面上,而不是你贴出来的这段代码,建议你用这边代码测试,在下载页面的代码debug下。很有可能是下载页面资源产生了锁什么的,是页面本身超时了。
      

  6.   

    我怀疑你第二个mp3文件是否存在。
    你debug,在调试时拿到第二个mp3的连接后,放到ie里去试下,看行不。
    还有一个做法是,你每次把request变量Abort掉,并且等于null。包括response,全部这样后,
    然后调用GC.Collect()试下在IO操作时经常会出现句柄在内存中没释放掉的情况。我估计连接也一样的。
      

  7.   

    你计算一下时间,看看是不是每次到一定的时间就出错的,如果是,设置一下Timeoue的属性,增大它。不过最完美的方案是使用异步编程,否则你的程序永远只能够自己用,不能发布出去让别人用。
      

  8.   

    第二个MP3是绝对存在的,可以在ie中下载下来的。
    GC.Collect()了也不行
      

  9.   

    to aluzi :
    谢谢你的回复!
    没有时间问题,只要是下载第2个,就会出错,而第二个的链接是绝对存在的。
      

  10.   

    我认为是http超时的问题!应考虑该下超时时限
      

  11.   

    我也出现了这个问题,运行到第五次的时候出现超时。
    后来我想是不是由于cookies的问题,所以每次request的时候就给他 new CookieContainer()。结果还真的是这个原因。
    request.CookieContainer = new CookieContainer();
      

  12.   

    我也出现了这个问题,运行到第五次的时候出现超时。
    后来我想是不是由于cookies的问题,所以每次request的时候就给他 new CookieContainer()。结果还真的是这个原因。
    request.CookieContainer = new CookieContainer();
      

  13.   

    request.About()需要放在循环中,每一个request都需要及时销毁掉,否则容易出现 “超时错误”;
      

  14.   

    可以参考:
    【已解决】HttpWebRequest的GetResponse偶尔超时
    http://www.crifan.com/2012/02/16/fixed_problem_sometime_httpwebrequest_getresponse_timeout/
      

  15.   

    可以参考我的:
    【已解决】HttpWebRequest的GetResponse偶尔超时
    http://www.crifan.com/2012/02/16/fixed_problem_sometime_httpwebrequest_getresponse_timeout/