苏飞论坛

 找回密码
 马上注册

QQ登录

只需一步,快速开始

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

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

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

查看: 18441|回复: 13

[其他] POST怎么实现多线程呢

[复制链接]
发表于 2013-12-12 13:00:40 | 显示全部楼层 |阅读模式
小弟正在做一个discuz群发机,在本地搭建的环境,想一次发布多个贴子。我的意思是想创建N条线程,然后每个线程都是独立进行POST,那样就不会因为POST执行太快而失败了。
但我发现我写的代码虽然是创建了N条线程,但执行起来就好像只创建了一条线程一样。

请问怎么实现每个线程都是独立进行POST,而不会像单线程那样执行完一次POST 又要等一会才执行下一次POST

代码:
[C#] 纯文本查看 复制代码
  public delegate void UpdateTxtdelegate();
        UpdateTxtdelegate updateTxtdelegatelg;
        UpdateTxtdelegate updateTxtdelegategd;
        UpdateTxtdelegate updateTxtdelegatebd;

private void update()
        {
            richStatus.AppendText("账号:" + txtUser.Text + "登陆成功" + "\n");
            richStatus.ScrollToCaret();
        }
        private void updategood()
        {
            richStatus.AppendText("发布成功" + "\n");
        }
        private void updatebad()
        {
            richStatus.AppendText("发布失败"+"\n");
        }
        //登陆
        private void btnLogin_Click(object sender, EventArgs e)
        {
            item.Method = "POST";
            item.Accept = "image/jpeg, application/x-ms-application, image/gif, application/xaml+xml, image/pjpeg, application/x-ms-xbap, application/msword, */";
            item.UserAgent = "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; Trident/5.0)";
            item.ContentType = "application/x-www-form-urlencoded";
            item.URL = "http://localhost/bbs/" + "/member.php?mod=logging&action=login&loginsubmit=yes&infloat=yes&lssubmit=yes&inajax=1";
            item.Postdata = "fastloginfield=username&username="+"cesi"+"&password="+"123456"+"&quickforward=yes&handlekey=ls";
            result = tool.GetHtml(item);
            foreach (CookieItem ck in HttpCookieHelper.GetCookieList(result.Cookie))
            {
                if (ck.Key.Contains("4F1R_"))
                {
                    cook += HttpCookieHelper.CookieFormat(ck.Key, ck.Value);
                }
            }

            item = new HttpItem();
            item.Method = "GET";
            item.Cookie = cook;
            item.Accept = "image/jpeg, application/x-ms-application, image/gif, application/xaml+xml, image/pjpeg, application/x-ms-xbap, application/msword, */";
            item.UserAgent = "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; Trident/5.0)";
            item.ContentType = "application/x-www-form-urlencoded";
            item.URL = "http://localhost/bbs/member.php?mod=logging&action=login";
            result = tool.GetHtml(item);
            formhash = Regex.Match(result.Html, @"(?<=formhash=)\w+").Value;
            if (cook.Contains("4F1R"))
            {
                //登陆成功
                richStatus.Invoke(updateTxtdelegatelg);
            }   
        }
        //发布
        private void btnPabu_Click(object sender, EventArgs e)
        {

            for (int i = 0; i < 10; i++)
            {
                Thread tre = new Thread(Fabu);
                tre.Start();
            }
                   
        }
        private void Fabu()
        {
            item = new HttpItem();
            item.Cookie = cook;
            item.Allowautoredirect = true;
            item.Method = "POST";
            item.Accept = "image/jpeg, application/x-ms-application, image/gif, application/xaml+xml, image/pjpeg, application/x-ms-xbap, application/msword, */";
            item.UserAgent = "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; Trident/5.0)";
            item.ContentType = "application/x-www-form-urlencoded";
            item.URL = "http://localhost/bbs/forum.php?mod=post&action=newthread&fid=2&extra=&topicsubmit=yes";
            item.Postdata = "formhash=" + formhash + "&posttime=1387595124&wysiwyg=1&subject=" + "测试文章标题" + "&message=" + "测试文章内容啊啊啊吼叫啊" + "&replycredit_extcredits=0&replycredit_times=1&replycredit_membertimes=1&replycredit_random=100&readperm=&price=&tags=&rushreplyfrom=&rushreplyto=&rewardfloor=&replylimit=&stopfloor=&creditlimit=&allownoticeauthor=1&usesig=1&save=";
            result = tool.GetHtml(item);
            //richStatus.AppendText("正在发贴......"+"\n");
            if (result.Html.Contains("测试"))
            {
                //发布成功
                richStatus.Invoke(updateTxtdelegategd);
            }
            else
            {
                //发布失败
                richStatus.Invoke(updateTxtdelegatebd);
            }
////既然是多线程,还需要Thread.Sleep吗????小弟不解///
            Thread.Sleep(1000); 
}



1. 开通SVIP会员,免费下载本站所有源码,不限次数据,不限时间
2. 加官方QQ群,加官方微信群获取更多资源和帮助
3. 找站长苏飞做网站、商城、CRM、小程序、App、爬虫相关、项目外包等点这里
发表于 2013-12-12 13:21:16 | 显示全部楼层
发表于 2013-12-12 13:43:04 | 显示全部楼层
只要在线程里写Post就行了,本身和多线程无关的。
 楼主| 发表于 2013-12-12 14:00:34 | 显示全部楼层
站长苏飞 发表于 2013-12-12 13:43
只要在线程里写Post就行了,本身和多线程无关的。

看了例子  没明白,在线程里写POST?是什么意思,可以具体点吗飞哥
发表于 2013-12-12 14:07:08 | 显示全部楼层
你看了我的例子如果都不明白,我就没办法了,我例子里写的就是多线程。http://www.sufeinet.com/forum.ph ... ;tid=13&ctid=26
 楼主| 发表于 2013-12-12 14:53:50 | 显示全部楼层
站长苏飞 发表于 2013-12-12 14:07
你看了我的例子如果都不明白,我就没办法了,我例子里写的就是多线程。http://www.sufeinet.com/forum.php? ...

我写的和你的例子也差不多吧 但执行起来就好像只创建了一条线程一样 还是需要间隔时间
发表于 2013-12-12 14:59:46 | 显示全部楼层
你想看效果就像我的例子一样给每个线程都显示一条数据,让它访问不同页面,这样不就看出来效果了。我例子中的是可行的,这个我经过很多次测试了,你的跟我的差不多。应该是可以的。
发表于 2013-12-12 15:00:37 | 显示全部楼层
时间间隔是必须要的,要不然有可能会启动不起来,你再研究下看看
 楼主| 发表于 2013-12-12 18:28:02 | 显示全部楼层
站长苏飞 发表于 2013-12-12 14:59
你想看效果就像我的例子一样给每个线程都显示一条数据,让它访问不同页面,这样不就看出来效果了。我例子中 ...

谢谢飞哥,原来上面的代码已经实现多线程,只不过设的线程少,以及界面卡死,所以看不出效果来。
 楼主| 发表于 2013-12-12 20:00:28 | 显示全部楼层
站长苏飞 发表于 2013-12-12 13:21
http://www.sufeinet.com/forum.php?mod=collection&action=view&ctid=26
看我的例子里面有

飞哥这不是多线程吧,只是一个线程中N次执行,刚在任务管理器看了下 ,执行的时候只多了一个线程。这样界面是不会假死,但我发现我这样写会假死:
[C#] 纯文本查看 复制代码
for (int i = 0; i < 100; i++)
{
Thread red = new Thread(new ThreadStart(delegate
{
Fabu();
}));
red.Start();
} 


用BeginInvoke也一样。




C#多线程|匿名委托传参数|测试网站压力--升级版
http://www.sufeinet.com/thread-13-1-1.html
看了飞哥的例子 运行了一下  开启多线程后拖动界面也同样是假死
这是什么问题呢飞哥
您需要登录后才可以回帖 登录 | 马上注册

本版积分规则

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

GMT+8, 2024-12-29 21:13

© 2014-2021

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