for(int i=0;i<listView1.Items.Count;i++)
     {
        string url = this.listView1.Items[i].SubItems[2].Text.Trim();//取出存在listview1里面的URL地址。
        //接下来要获取每个URL对应的源代码,保存到数据库。(URL个数超过100)
      }
请问使用多线程怎么样来实现,(现在的速度实在是不行阿,救救我吧,大虾们)

解决方案 »

  1.   

    public static void ThreadProc() {通信 //你读数据库的函数
            for (int i = 0; i < 10; i++) {
                Console.WriteLine("ThreadProc: {0}", i);
                // Yield the rest of the time slice.
                Thread.Sleep(0);
            }
        }//可以把下面写在你想什么时候运行读数据库的地方
            Thread t = new Thread(new ThreadStart(ThreadProc)); //创建线程
            t.Start(); //线程启动
      

  2.   

    对ListView中的数据通过DataTable复制一份,保持实时同步,更新数据库直接操作该DataTable就行了。
    这样也不需要多线程。
    即以空间换时间。
      

  3.   

    这个我试过了!但是好像速度还是不行阿!不知道是什么原因
       for(int a=0;a<listView2.Items.Count;a++)
    {
             int _ThreadNum1 = listView2.Items.Count;  Thread[] mythread1 = new Thread [ _ThreadNum1 ] ;  threadadd hostping1 = new threadadd(); hostping1.url = this.listView2.Items[a].SubItems[2].Text.Trim();//添加数据库 hostping1.sd1 = this.listView2.Items[a].SubItems[1].Text.Trim();//添加数据库 hostping1.sd2 = this.listView2.Items[a].SubItems[0].Text.Trim();();//添加数据库 hostping1.sd3 = DateTime.Now.ToString();();//添加数据库
             hostping1.sd4 = Int16.Parse(this.listView2.Items[a].SubItems[3].Text.Trim());();//添加数据库
    hostping1.getcode = new GetThreadHTMLlist(GetThreadHTML);
    mythread1[a] = new Thread (new ThreadStart (hostping1.threadStart)) ; 
    //初始化一个线程实例 
    mythread1[a].Start() ; 
        mythread1[a].Join();
    }
      

  4.   

    to:zhongkeruanjian(编程亮子)
    你说的瓶颈是什么意思阿?下面是我使用的获取网页源代码的-
    private string GetHTML(string url)
    {

    System.Net.WebClient client = new System.Net.WebClient();

    try
    {
    byte[] buf  = client.DownloadData(url);
    return System.Text.Encoding.Default.GetString(buf);
    }
    catch( Exception er)
    {
    MessageBox.Show(er.ToString());
    }

    }
      

  5.   

    to:copico(苦涩)
    呵呵!本来我是想是不是一个目标开一个线程,速度会更快。你觉得我该怎么样来做??
      

  6.   

    用HttpWebRequest获取网页,看看是不是比WebClient 快一些啊?
      

  7.   

    to:xzhunter(xz) 
    没有什么效果的。
      

  8.   

    WebClient,就完蛋了,他只支持最多两个TCP连接,所以10个线程也只有两个在工作,其他的都在等待。
    你得用HttpWebRequest,设置最大链接数大一点,然后亲自保存Response。HttpWebRequest hr = (HttpWebRequest)WebRequest.Create(myQuery.Url);
    hr.Method = "GET";
    hr.ServicePoint.ConnectionLimit = 100; //这里就是最大链接数
    HttpWebResponse response = (HttpWebResponse)hr.GetResponse();using (StreamReader sr = new StreamReader(response.GetResponseStream()))
    {
        using (StreamWriter sw = new StreamWriter(fileName, false))
        {
            sw.Write(sr.ReadToEnd());
        }
    }
      

  9.   

    WebClient,就完蛋了,他只支持最多两个TCP连接,所以10个线程也只有两个在工作,其他的都在等待。
    你得用HttpWebRequest,设置最大链接数大一点,然后亲自保存Response。HttpWebRequest hr = (HttpWebRequest)WebRequest.Create(myQuery.Url);
    hr.Method = "GET";
    hr.ServicePoint.ConnectionLimit = 100; //这里就是最大链接数
    HttpWebResponse response = (HttpWebResponse)hr.GetResponse();using (StreamReader sr = new StreamReader(response.GetResponseStream()))
    {
        using (StreamWriter sw = new StreamWriter(fileName, false))
        {
            sw.Write(sr.ReadToEnd());
        }
    }
    ------------------------------------
    高,实在是高!
      

  10.   

    to:GXY2005(不好!我看見豬在天上飛)
    呵呵!谢谢关注! 
    应该不是我没有表达清楚吧?
      

  11.   

    瓶颈主要出在取url的源代码,所以应该对每一个url 使用一个线程,由这个线程来负责取数据并存到数据库。
      

  12.   

    对每一个url都采用一个单独的线程来处理,这些线程同时启动处理,当中没什么需要同步的地方,至于数据库连接,可以每个线程开一个连接。这样处理完成的时间取决于你那个最慢的url需要多少时间,这跟网站的速度以及网页的大小有关
      

  13.   

    for(int a=0;a<listView2.Items.Count;a++)
    {
       int _ThreadNum1 = listView2.Items.Count;
       Thread[] mythread1 = new Thread [ _ThreadNum1 ] ; 
       threadadd hostping1 = new threadadd();
       hostping1.getcode = new GetThreadHTMLlist(GetThreadHTML);
    mythread1[a] = new Thread (new ThreadStart (hostping1.threadStart)) ; 
    //初始化一个线程实例 
    mythread1[a].Start() ; 
        mythread1[a].Join();
    }
    我是这样来建立线程,,你觉得我这样行不行??
    to-----charles_y(每天上网一小时
      

  14.   

    mythread1[a].Join();???
    你这样不是一个线程执行完才能执行下一个线程?这跟一个线程有什么两样?
      

  15.   

    但是我在想是不是这个本身就是一个执行完再去执行下一个呢?我listview1里面循环读出来。也是等到一个线程执行完了再继续下个循环呢?我不知道我这样的理解对不对?
      

  16.   

    如果是执行完了再执行下一个,那跟一个线程(或者说根本不用线程)有什么区别?
    用多个线程的目的,就是为了同时执行,多个线程同时各自去取自己的url的内容(这是瓶颈),这样才能提高效率。
      

  17.   

    呵呵!但是我没有发现效率的提高,不知道什么原因啊!
    --------------------------------
    你代码改了?把改过的贴出来看看你原来那个代码当然不行了,这个mythread1[a].Join();往这儿一放,你这个多线程跟没有现成有什么区别?
      

  18.   

    for(int i=0;i<listView1.Items.Count;i++)
    {
    int _ThreadNum = threadCount; 
     Thread[] mythread = new Thread [ _ThreadNum ] ; 
                     hostping.getcode = new GetThreadHTMLlist(GetThreadHTML);
     mythread[i] = new Thread (new ThreadStart (hostping.threadStart)) ; 
    //初始化一个线程实例 
                   mythread[i].Start() ; 
           }
      

  19.   

    我把你说得那个mythread1[a].Join();删除了!
      

  20.   

    1 Ninputer(装配脑袋) 的方法只是改变了连接同一个网站的连接数量.如果你是采集不同的网站的话,改这里应该没什么太大用处.
    2 (HttpWebResponse)hr.GetResponse(); 如果你是在.net2.0的话,我不建议你用这个方法,这是个同步方法,CPU利用率不高.
    3 使用多线程,你自己来控制线程的话,有很大一部分消耗在线程的创建和销毁上了,应该用线程池来操作线程,
    4 效率高的解决办法是使用异步操作,调用HttpWebRequest.BeginGetResponse()来进行异步调用.
    独取流也应该使用异步方法.问题的关键在于CPU利用率和带宽利用率怎么能达到一个平衡.如果CPU很高而带宽比较小,那怎么做性能都差不多了.
      

  21.   

    to:kirc(无聊中) 
    谢谢,指导,但是本人是菜鸟,能不能给出具体的代码或者例子?谢谢!
      

  22.   

    to:codermarshel(提着杀猪刀来灌水)
    谢谢了!
      

  23.   

    .net程序是慢点的!不过比起从网络的url获得信息的速度却是大大有余。开个多线程就让它慢慢收集吧。通常情况下,非主线程的速度会更慢些,因为他默认的优先级别低。