我做了一个简单的下载程序,用一个线程循环下载一个文件列表
用下面的方式 不能正确显示下载状态 我对线程不是很了解
 请各位高手指点 该怎样做System.Threading.Thread thread001 = null;
DownloadClass dc = new DownloadClass(); //下载类                  
System.Threading.ThreadStart startDownload = new System.Threading.ThreadStart(dc.DownloadFile);//dc.DownloadFile是下载类中的函数
for (int i = 0; i < rc.Count; i++)
{
thread001 = new System.Threading.Thread(startDownload);
thread001.Start();
 }

解决方案 »

  1.   

    有没有冲突要看你的DownloadFile方法是怎么实现的。如果有冲突的话,可以使用互斥锁。
      

  2.   

    这种单一线程循环方式怎么用Mutex?
      

  3.   

    检查DownloadFile到本地是不是路径一样
      

  4.   

    Monitor用法try
    {
       Monitor.Enter(this)
       // 公共资源处理代码   
    }
    finally
    {
       Monitor.Exit(this)
    }至于显示下载状态不正确,你的需求说明不是很清楚,无法解释
      

  5.   

    这种下载的可以考虑一下线程池
    http://www.cnblogs.com/Bird/archive/2007/03/12/671880.html
      

  6.   

    贴出全部代码 请大家帮忙
    --------循环调用时--------------------------------------------------------------
                        for (int i = 0; i < rc.Count; i++)
                        {
                            string ss = rc[i].Cells["图幅地址"].Value.ToString();
                            DownloadClass dc = new DownloadClass();     
                            thread001 = new System.Threading.Thread(new System.Threading.ThreadStart(dc.DownloadFile));
                            dc.StrUrl = ss;
                            dc.StrFileName = "f:\\xd_" + rc[i].Cells["图幅编号"].Value.ToString() + ".jpg";
                            dc.rowNum = i;
                            thread001.Start();                    }
    ---------下载类------------------------------------------------------------
     public class DownloadClass 
      {  
       //打开上次下载的文件或新建文件 
           public string StrUrl;//文件下载网址
           public string StrFileName;//下载文件保存地址 
           public string strError;//返回结果
           public long lStartPos =0; //返回上次下载字节
           public long lCurrentPos=0;//返回当前下载字节
           public long lDownloadFile;//返回当前下载文件长度
           public int rowNum = 0;      //public static voic SetText(frmMain objForm)        //这里传递的是Form1窗体类的一个实例
          //{
          //    objForm.dataGridView2.Rows[3].Cells["文件大小"].Value = a.ToString();          //这样就可以找到我们定义的属性
          //}      public void DownloadFile()
          {
              System.IO.FileStream fs;
              if (System.IO.File.Exists(StrFileName))
              {
                  fs = System.IO.File.OpenWrite(StrFileName);
                  lStartPos = fs.Length;
                  fs.Seek(lStartPos, System.IO.SeekOrigin.Current);
                  //移动文件流中的当前指针 
              }
              else
              {
                  fs = new System.IO.FileStream(StrFileName, System.IO.FileMode.Create);
                  lStartPos = 0;
              }          //打开网络连接 
              try
              {
                  System.Net.HttpWebRequest request = (System.Net.HttpWebRequest)System.Net.HttpWebRequest.Create(StrUrl);
                  long length = request.GetResponse().ContentLength;
                  frmMain.dataGridView2.Rows[rowNum].Cells["文件大小"].Value = length.ToString();              frmMain.dataGridView2.Rows[rowNum].Cells["状态"].Value = "开始下载";
                   
                  lDownloadFile = length;
                  if (lStartPos > 0)
                      request.AddRange((int)lStartPos); //设置Range值               //向服务器请求,获得服务器回应数据流 
                  System.IO.Stream ns = request.GetResponse().GetResponseStream();              byte[] nbytes = new byte[512];
                  int nReadSize = 0;
                  nReadSize = ns.Read(nbytes, 0, 512);
                  while (nReadSize > 0)
                  {
                      fs.Write(nbytes, 0, nReadSize);
                      nReadSize = ns.Read(nbytes, 0, 512);
                      lCurrentPos = fs.Length;
                      frmMain.dataGridView2.Rows[rowNum].Cells["已下载"].Value = lCurrentPos.ToString();
                      frmMain.dataGridView2.Rows[rowNum].Cells["下载进度"].Value = Convert.ToString((lCurrentPos / length) * 100) + "%";
                  }
                  if (lCurrentPos == length)
                  {
                      frmMain.dataGridView2.Rows[rowNum].Cells["状态"].Value = "完成";
                  }
                  else
                  {
                      frmMain.dataGridView2.Rows[rowNum].Cells["状态"].Value = "未完成";
                  }              fs.Close();
                  ns.Close();
                  strError = "下载完成";
      
                   
              }
              catch (Exception ex)
              {
                  fs.Close();
                  strError = "下载过程中出现错误:" + ex.ToString();
                  frmMain.dataGridView2.Rows[rowNum].Cells["状态"].Value = "错误下载";
              }      }
      } 
      //定义下载类结束 主要问题 第一次下载返回的大小都正确 再重新下载时返回的文件大小 全部翻倍了
      

  7.   

    good good study !day day up!