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

苏飞论坛

 找回密码
 马上注册

QQ登录

只需一步,快速开始

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

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

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

查看: 12084|回复: 13

[其他] 多线程使用httphelper怎么设置当上一调用正在进行时,不能重新调用 BeginGetReques

[复制链接]
发表于 2013-9-18 16:38:26 | 显示全部楼层 |阅读模式
多线程运行提示!当上一调用正在进行时,不能重新调用 BeginGetRequestStream/BeginGetResponse。


1. 开通SVIP会员,免费下载本站所有源码,不限次数据,不限时间
2. 加官方QQ群,加官方微信群获取更多资源和帮助
3. 找站长苏飞做网站、商城、CRM、小程序、App、爬虫相关、项目外包等点这里
发表于 2013-9-18 17:18:05 | 显示全部楼层
看代码,是不是两个线程使用了同一个对象。HttpHelper的对象 ,要在每个线程里单独生成一个对象
 楼主| 发表于 2013-9-18 18:33:40 | 显示全部楼层
  是同时生成了几个同行的,因为httphelper  怎么生成单独的,也不能生成数组类型的,COOKies   也处理不了
发表于 2013-9-18 19:30:15 | 显示全部楼层
每一个线程里面写一个就是了。你贴下代码看看吧
 楼主| 发表于 2013-9-18 21:19:58 | 显示全部楼层
ParameterizedThreadStart startDownload = new ParameterizedThreadStart(Dntq);//线程起始设置:即每个线程都执行DownLoad()
                downloadThread = new Thread[theMatches.Count];//为线程申请资源,确定线程总数
                foreach (Match thematch in theMatches)
                {
                    if (thematch.Length != 0)
                    {
                       rwjdt.Value += 90 / theMatches.Count;
                       IpAndPort aa = new IpAndPort();

                       //for (int i = 0; i < n; i++)//开启指定数量的线程数
                       //{
                        //currentline=kk;
                       //sjo =
                       downloadThread[kk] = new Thread(startDownload);//指定线程起始设置
                       aa.sjk = thematch.Value.ToString();
                       aa.ls = kk;
                       downloadThread[kk].Start((object)aa);//逐个开启线程
                       if (kk<2)
                        {
                          kk += 1;
                        }
                       //Thread.Sleep(500);//当前线程(你所谓的子线程)休息50毫秒
                       //}
                       //Thread thr = new Thread(a);
                        //IpAndPort aa = new IpAndPort();
                        //aa.sjk = "123.123.123.123";
                        //aa.ls = 1;
                        //thr.Start((object)aa);
  
                    }

                }


                this.richTextBox1.Text += "\r\n" + "提取完毕!";
                rwjdt.Value = 100;
            }
            else
                this.richTextBox1.Text += "\r\n文件下载失败!";
            #endregion
        }
        struct IpAndPort
        {
            public string sjk;
            public int ls;   
        }
      
        private void Dntq(object aa)
        {
            Thread.Sleep(800);
            IpAndPort sjxl = (IpAndPort)aa;
            //m_TaoItem m_TaoItem1 = new m_TaoItem();
            //m_TaoItem1.CookieCollection = m_TaoItem.CookieCollection;
            //string resultt = "";
            //resultt += "\r\n" + thematch.Value.ToString();
            Match TitleMatch = Regex.Match(sjxl.sjk, ":([^<]*)</label></span>", RegexOptions.IgnoreCase | RegexOptions.Multiline);
            Match TitleMatch1 = Regex.Match(sjxl.sjk, "userID=([^<]*)\" target=", RegexOptions.IgnoreCase | RegexOptions.Multiline);
            Match TitleMatch2 = Regex.Match(sjxl.sjk, "查看宝贝详情\" target=\"_blank\">([^<]*)</a><br />", RegexOptions.IgnoreCase | RegexOptions.Multiline);
            Match TitleMatch3 = Regex.Match(sjxl.sjk, "<td class=\"num\" title=\"([^<]*)\">", RegexOptions.IgnoreCase | RegexOptions.Multiline);
            Match TitleMatch4 = Regex.Match(sjxl.sjk, "<strong class=\"J_OrderPrice\">([^<]*)</strong>", RegexOptions.IgnoreCase | RegexOptions.Multiline);

            ListViewItem lvItem1 = new ListViewItem();
            lvItem1.Tag = "";
            lvItem1.Text = " ";
            string[] strRoom2 = { " ", " ", " ", " ", " ", " ", " ", " " };
            lvItem1.SubItems.AddRange(strRoom2);
            ListView1.Items.Add(lvItem1);
            //ListView1.Items.Add(Convert.ToString(currentline + 1));
            ListView1.Items[sjxl.ls].SubItems[0].Text = Convert.ToString(sjxl.ls + 1);
            ListView1.Items[sjxl.ls].SubItems[1].Text = TitleMatch.Groups[1].Value;
            ListView1.Items[sjxl.ls].SubItems[2].Text = TitleMatch1.Groups[1].Value;
            ListView1.Items[sjxl.ls].SubItems[3].Text = TitleMatch2.Groups[1].Value;
            ListView1.Items[sjxl.ls].SubItems[4].Text = TitleMatch3.Groups[1].Value;
            ListView1.Items[sjxl.ls].SubItems[5].Text = TitleMatch4.Groups[1].Value;


            #region 提取订单文件

         
           // HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(new Uri("http://trade.taobao.com/trade/detail/trade_item_detail.htm?bizOrderId=" + TitleMatch.Groups[1].Value));
            m_TaoItem.Method = "get";
            m_TaoItem.URL = "http://trade.taobao.com/trade/detail/trade_item_detail.htm?bizOrderId=" + TitleMatch.Groups[1].Value;
            //string.Format("http://u.alimama.com/union/newreport/taobaokeDetail.do?toPage=1&perPageSize=20&startTime={0}&endTime={1}&DownloadID=DOWNLOAD_REPORT_INCOME_NEW&payStatus=&total=100&queryType=1", DateTime.Now.AddDays(-7).ToString("yyyy-MM-dd"), DateTime.Now.ToString("yyyy-MM-dd"));
            m_TaoItem.ResultType = ResultType.Byte;     //这里注意是以字节方式获取结果
            m_TaoItem.Allowautoredirect = true;         //这里一定要为真
            m_TaoItem.Accept = "text/html, application/xhtml+xml, */*";
            //m_TaoItem.Referer = "http://u.alimama.com/union/newreport/taobaokeDetail.htm?spm=0.0.0.0.LloOpJ";
            m_TaoItem.Header["Accept-Encoding"] = "gzip, deflate";
            HttpResult result = m_Http.GetHtml(m_TaoItem);
            
            //收货地址:</th><td>
            //Match TitleMatch9 = Regex.Match(resultp.Html.Replace("\r\n", ""), "class=\"simple-list logistics-info\">([^<]*)</td>", RegexOptions.IgnoreCase | RegexOptions.Multiline);
            Match TitleMatch5 = Regex.Match(result.Html.Replace("\r\n", ""), "收货地址:</th>(.*?)</td>", RegexOptions.IgnoreCase | RegexOptions.Multiline);

            ListView1.Items[sjxl.ls].SubItems[6].Text = TitleMatch5.Groups[1].Value.Replace("<td>", "").Replace(" ", "");
            //this.richTextBox1.Text += "\r\n" + ListView1.Items[sjxl.ls].SubItems[1].Text.ToString() + sjxl.ls.ToString();
            ListView1.Items[sjxl.ls].SubItems[7].Text = "提取完毕" + sjxl.ls.ToString();
           // xLog("线程:" + sjxl.ls + "执行完成!");
            
            downloadThread[sjxl.ls].Abort();
            
            #endregion

        }
 楼主| 发表于 2013-9-18 21:21:06 | 显示全部楼层
你看下,我用的是多个线程,里面不知道怎么申请新的httphelper 用一个就提示这个!
发表于 2013-9-18 21:25:43 | 显示全部楼层
怎么没见有httphelper啊?明天吧,手机不方便看,
 楼主| 发表于 2013-9-18 21:57:43 | 显示全部楼层
m_TaoItem不就是你那个httphelper  嘛全局的。
发表于 2013-9-19 08:04:04 | 显示全部楼层
把你的全局删除,在哪用,在哪里new就行了,线程指间是不能共用一个对象的,因为当一个线程给它负值时另一个也会负值,一个执行时另一个也会执行,你想想这样是不是就乱了。你给他个值是a假如,你执行时另一个线程把它变成了b'这样跟定有问题,抛开我的类不说,你多线程之间共用任何一个对象或者是变量都是不行的,都会乱套的。
 楼主| 发表于 2013-9-19 13:08:07 | 显示全部楼层
嗯明白了,理解有错误但是你的那个httphelper   新建的话那cookies  不就变了吗,没办法用数组,中秋节快乐
您需要登录后才可以回帖 登录 | 马上注册

本版积分规则

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

GMT+8, 2024-5-15 01:04

© 2014-2021

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