当前位置:编程学习 > C#/ASP.NET >>

问大家一个有关多线程的问题,帮顶有分

是这样的,公司要我做个采集,采集一些关于我们网站相关的资料
采集是会做了,可是只能输入一个地址,然后采集那个地址
第一个问题:怎么只要输入一个地址,然后采集这个网页,还采集这一页网页的上一页下一页的链接,
如果这页采集完了就自动到下一页的链接采集呢?
第二个问题:怎么采用多线程采集呢?查了下资料说多线程可以很好的利用cpu,而且速度肯定比一篇一篇采集快

采集代码

            string url = "http://www.qq.com/";
            string path = Server.MapPath("index.html");
            StringBuilder sb = new StringBuilder();
            HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);
            WebResponse rep = req.GetResponse();
            using (StreamReader sr = new StreamReader(rep.GetResponseStream())
                {
                    sb.Append(sr.ReadToEnd());
                 }
                using (StreamWriter sw = new StreamWriter(path,false))
                {
                    sw.WriteLine(sb.ToString());
                }
            }

请教下该怎么改呢?还有我是写在button事件里的 这样可以吗? --------------------编程问答-------------------- 这个例子,你可以先看看http://topic.csdn.net/u/20100814/01/B3CF6C1D-E006-4282-8C04-37C38BF326E6.html --------------------编程问答-------------------- --------------------编程问答-------------------- 开个公司好累 --------------------编程问答-------------------- 使用系统线程池来执行一个任务,就是这样一句话:
ThreadPool.QueueUserWorkItem(new Action(()=>{
  //todo: 这里写你要执行的方法的代码
}));
--------------------编程问答-------------------- 用HttpRequest实现,不要用HttpWebRequest   --------------------编程问答-------------------- 采集网页的上一页下一页,应该知道URL的规律写个循环就可以了吧 --------------------编程问答-------------------- --------------------编程问答-------------------- --------------------编程问答-------------------- 用采用线程池 --------------------编程问答--------------------
引用 4 楼 sp1234 的回复:
使用系统线程池来执行一个任务,就是这样一句话:

C# code
ThreadPool.QueueUserWorkItem(new Action(()=>{
  //todo: 这里写你要执行的方法的代码
}));

sp大哥自己做老板拉!

            DateTime star = DateTime.Now;
            StringBuilder sb = new StringBuilder();
            Thread td = null;
            foreach (string result in ilist)
            {
                td = new Thread(new ParameterizedThreadStart(Save2));
                /*
                为什么这里用多线程来采集的话总是没有采集完,只有7,8个
                  如果改用Save(result, Server.MapPath(@"collection/" + datetime + ".html"));这样直接保存的话是有全部采集到,总共241个,这是为什么呢?
                  */

                td.Start(result);
            }
            DateTime end = DateTime.Now;
            Response.Write((end - star).TotalMilliseconds);
--------------------编程问答-------------------- 自动重定向。 --------------------编程问答--------------------
引用 5 楼 panzhige 的回复:
用HttpRequest实现,不要用HttpWebRequest
为什么不要用HttpWebrequest呢?有什么坏处吗? --------------------编程问答-------------------- 最好能在网上找个例子。先读读吧....csdn下载里面应该很多。 --------------------编程问答--------------------

class Program   
{   
     static void Main(string[] args)   
    {   
         List<Action> actions = new List<Action>();   
         actions.Add(() => Console.WriteLine("A1"));   
        actions.Add(() => Console.WriteLine("A2"));   
        actions.Add(() => Console.WriteLine("A3"));   
       actions.Add(() => Console.WriteLine("A4"));   
   
         foreach (var action in actions)  
         {  
            ThreadPool.QueueUserWorkItem(state => action(), null);         }   
    
        Console.Read();  
   }  

--------------------编程问答-------------------- --------------------编程问答-------------------- 多线程不会的路过... --------------------编程问答-------------------- --------------------编程问答-------------------- 按照ls的大侠们试了一下线程池的,可是只采集到18个,总共有241个的,用单线程的话就可以全部采集到,
这是为什么呢?而且屏幕右下角端口号会自己掉下来

        protected void Button5_Click(object sender, EventArgs e)
        {
            DateTime star = DateTime.Now;
            StringBuilder sb = new StringBuilder();
            foreach (string result in ilist)//ilist是链接的集合
            {
                ThreadPool.QueueUserWorkItem(delegate(object param)
                {
                    Save2(result);
                });
            }
            DateTime end = DateTime.Now;
            Response.Write((end - star).TotalMilliseconds);
        }
--------------------编程问答-------------------- 我是来帮顶的。。。。 --------------------编程问答-------------------- 每天回帖即可获得10分可用分!小技巧:教您如何更快获得可用分


--------------------编程问答-------------------- --------------------编程问答-------------------- SOS紧急求救! --------------------编程问答-------------------- 多线程不咋的会  帮你顶 --------------------编程问答-------------------- 没有这方面的经验 帮顶 --------------------编程问答-------------------- --------------------编程问答-------------------- 路过............................ --------------------编程问答-------------------- 谢谢大家!继续等待! --------------------编程问答--------------------

一页一页的抓取,主要是变化url里面的参数。
比如:
http://www.baidu.com/s?wd=asd&pn=0&usm=2 第1页
http://www.baidu.com/s?wd=asd&pn=10&usm=2 第2页

生成对应的url即可,然后扔给采集代码里面的url

线程,声明下,然后调用对应方法就可以

Thread thread = new Thread(new ThreadStart(方法));
thread.Start();

多线程多声明几次就可以。
--------------------编程问答-------------------- 大侠在来帮帮忙! --------------------编程问答-------------------- 多线程,网上很多例子 --------------------编程问答-------------------- 可以 参考 火车头 软件

简单点 网页源码分析呢 --------------------编程问答-------------------- --------------------编程问答-------------------- --------------------编程问答--------------------

路过............................


--------------------编程问答-------------------- 学习,顺便帮顶!人家说了,帮顶有分地.....
补充:.NET技术 ,  ASP.NET
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,