http://www.sufeinet.com/plugin.php?id=keke_group

苏飞论坛

 找回密码
 马上注册

QQ登录

只需一步,快速开始

分布式系统框架(V2.0) 轻松承载百亿数据,千万流量!讨论专区 - 源码下载 - 官方教程

HttpHelper爬虫框架(V2.7-含.netcore) HttpHelper官方出品,爬虫框架讨论区 - 源码下载 - 在线测试和代码生成

HttpHelper爬虫类(V2.0) 开源的爬虫类,支持多种模式和属性 源码 - 代码生成器 - 讨论区 - 教程- 例子

查看: 3706|回复: 2

[C#语言基础] 求教多线程处理同一个任务的效率问题

[复制链接]
发表于 2013-12-19 21:14:36 | 显示全部楼层 |阅读模式
请教大伙,我想用多线程来抓取一组链接的数据,我的思路是每个线程取到一个链接后,抓取完该链接的数据后,把该链接元素从待处理链接数组中删除。 我把links.RemoveAt(0);  语句提前的话会不会更好一些?就是线程取到链接后赋值给一个变量,然后马上把改链接从待处理链接数组中删除,这样其他线程就可以更快地获取待处理链接,而不用等到当前链接抓取完数据后再获取待处理链接数组的值,效率是不是会高一些?

还有一个问题是,如果某个线程发生了异常(比如数据抓取不全),如何重启该线程并重新活链接进行处理?   

有没有更好的方法呢?谢谢


[C#] 纯文本查看 复制代码
 //声明全局变量:所有待处理的网址数组
public static List<string> links = new List<string>();

         //按钮事件
        private void button1_Click(object sender, EventArgs e)
        {
                    threadOne = new Thread(new ThreadStart(getItemDetail));//两个线程共同做一件事情
                    threadTwo = new Thread(new ThreadStart(getItemDetail));//两个线程共同做一件事情
                    threadOne.Name = "线程1";
                    threadTwo.Name = "线程2";
                    threadOne.Start();
                    threadTwo.Start();

        }


        private void getItemDetail()  //处理函数
        {
            string link = null;  //单条网址
            while (true)
            {
                Monitor.Enter(links);//锁定,保持同步
                link = (string)links[0];

。。。somecode here//  具体的处理语句,每次处理需要耗时一分钟

                    links.RemoveAt(0);//删除链接数组List中的元素
                   
                    if (links.Count == 0)
                    {
                        ThreadEnd();//引发完成事件
                    }
                    toolStripStatusLabel1.Text = Thread.CurrentThread.Name + "抓取" + link + "成功...";

                    Monitor.Exit(links);//取消锁定
                    Thread.Sleep(5);
            }
        }



1. 开通SVIP会员,免费下载本站所有源码,不限次数据,不限时间
2. 加官方QQ群,加官方微信群获取更多资源和帮助
3. 找站长苏飞做网站、商城、CRM、小程序、App、爬虫相关、项目外包等点这里
发表于 2013-12-20 08:13:09 | 显示全部楼层
第一个问题:当然是会提高,而且我建议你可 以加锁来限制重复获取的情况。
同时开多个线程是很快的,也有可能两个线程是同时获取的。所以可以加锁的。
第二个问题,这个你可以参考我的文章http://www.sufeinet.com/thread-13-1-1.html
原理很简单,就是在线程执行的方法里面直接使用try块,出现异常后依然执行下一次,就是让try包住你的循环体就行了。例如
[C#] 纯文本查看 复制代码
private void getItemDetail()  //处理函数
        {
            string link = null;  //单条网址
            while (true)
            {
try
{
                Monitor.Enter(links);//锁定,保持同步
                link = (string)links[0];
 
。。。somecode here//  具体的处理语句,每次处理需要耗时一分钟
 
                    links.RemoveAt(0);//删除链接数组List中的元素
                    
                    if (links.Count == 0)
                    {
                        ThreadEnd();//引发完成事件
                    }
                    toolStripStatusLabel1.Text = Thread.CurrentThread.Name + "抓取" + link + "成功...";
 
                    Monitor.Exit(links);//取消锁定
                    Thread.Sleep(5);
} catch (Exception){}
            }
        }

 楼主| 发表于 2013-12-21 10:42:58 | 显示全部楼层
本帖最后由 tylrr 于 2013-12-21 12:13 编辑
站长苏飞 发表于 2013-12-20 08:13
第一个问题:当然是会提高,而且我建议你可 以加锁来限制重复获取的情况。
同时开多个线程是很快的,也有 ...

谢谢站长的指点,我觉得thread虽然灵活,但是要增加很多代码来控制,觉得很麻烦,所以想使用net4.0新增的Parallel特性 来处理。上述代码修改后如下。问题:请问使用Parallel.Invoke() 和 Task.Factory.StartNew() 哪个更好呢?若要实现,以下代码应该如何修改?另外如何在Parallel.ForEach中更新界面呢?  程序老提示出错,最后不得不把更新界面的那部分去掉了。   谢谢指点

[C#] 纯文本查看 复制代码
        public static List<string> links = new List<string>();  //声明全局变量 链接为links List
        private void button1_Click(object sender, EventArgs e)
        {
                    //设置最大线程数
                    ThreadPool.SetMaxThreads(2, 2);
                   //采集
                    Parallel.ForEach(links, (linkitem) =>
                    {
                        getItemDetail(linkitem);
                    });

                    toolStripStatusLabel1.Text = "采集完毕。";
         }


        private void getItemDetail(string link)
        {
        try{
                        //采集数据代码第一部分
                        if (jieguo.Count != 15)  //如果得到的数组元素少于15个代表采集失败
                            throw new Exception();
            }
        catch (Exception e)
           {
                        
            }
                       
                           。。。。。。。。。
         }


您需要登录后才可以回帖 登录 | 马上注册

本版积分规则

QQ|手机版|小黑屋|手机版|联系我们|关于我们|广告合作|苏飞论坛 ( 豫ICP备18043678号-2)

GMT+8, 2024-12-19 13:04

© 2014-2021

快速回复 返回顶部 返回列表