• 多线程实际运用<第七篇>


    1、单线程采集100个页面

    复制代码
        class Program
        {
            static int i = 6991275;
            static void Main(string[] args)
            {
                Stopwatch sw = new Stopwatch();
                sw.Start();
                getTitle();
                sw.Stop();
                Console.WriteLine("采集100个页面完成,用时:" + sw.ElapsedMilliseconds + "毫秒");
    
                Console.ReadKey();
            }
    
            static void getTitle()
            {
                for (int j = 0; j < 100; j++)
                {
                    WebClient wc = new WebClient();
                    wc.BaseAddress = "http://www.juedui100.com/";
                    wc.Encoding = Encoding.UTF8;
                    string html = wc.DownloadString("user/" + ++i + ".html");
                    Regex reg = new Regex(@"<title>(.*)</title>");
                    Console.WriteLine(reg.Match(html));
                }
            }
        }
    复制代码

      输出:

      

    2、多线程采集100个页面

    复制代码
        class Program
        {
            static int i = 6991275;
            static volatile int k = 1;
            static void Main(string[] args)
            {
                Stopwatch sw = new Stopwatch();
                sw.Start();
                for (int i = 0; i < 5; i++)
                {
                    ThreadPool.QueueUserWorkItem(getTitle);
                }
                while (true)
                {
                    if (k == 5)
                    {
                        sw.Stop();
                        break;
                    }
                }
                Console.WriteLine("采集100个页面完成,用时:" + sw.ElapsedMilliseconds + "毫秒");
                Console.ReadKey();
            }
    
            static void getTitle(object o)
            {
                while(i < 6991375)
                {
                    WebClient wc = new WebClient();
                    wc.BaseAddress = "http://www.juedui100.com/";
                    wc.Encoding = Encoding.UTF8;
                    string html = wc.DownloadString("user/" + Interlocked.Increment(ref i) + ".html");
                    Regex reg = new Regex(@"<title>(.*)</title>");
                    Console.WriteLine(reg.Match(html));
                }
                k++;
            }
        }
    复制代码

      输出如下:

      

      单纯从执行时间来看,采集100个页面,用5个线程效率提升2倍多,当然这跟带宽也有关系啦。

      有问题,好像K++多个线程执行的时候有问题,也要Interlocked.Increment。以后再改、

  • 相关阅读:
    [Redis知识体系] 一文全面总结Redis知识体系
    MySQL数据导入到ClickHouse
    docker本地搭建clickhouse
    【linux】修改宝塔默认的PHP CLI版本
    windows 10 安装go环境
    docker安装centos8
    Bootstrap 简洁、直观、强悍的前端开发框架,让web开发更迅速、简单。
    C#调用WebService
    登录时,记住用户的帐号密码
    asp.net,cookie,写cookie,取cookie
  • 原文地址:https://www.cnblogs.com/mingxuantongxue/p/3944424.html
Copyright © 2020-2023  润新知