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

苏飞论坛

 找回密码
 马上注册

QQ登录

只需一步,快速开始

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

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

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

楼主: zbsgift

[求助] 关于京东post数据格式问题

[复制链接]
 楼主| 发表于 2014-2-13 14:13:05 | 显示全部楼层
站长苏飞 发表于 2014-2-13 12:50
http://www.sufeinet.com/thread-13-1-1.html

我就是参照你这个帖子的,不同的是我线程要执行的方法有返回值,因为我的方法没写在form里,所以不能直接操作form里的控件,只能通过获取返回值,然后在写到form的控件中。
所以我定义了一个委托
private delegate string WorkallOrder(string username, string password, string goodId);
然后
_workallOrder = new WorkallOrder(worker.workAll);
IAsyncResult result = _workallOrder.BeginInvoke(userid, pwd, textBox2.Text,null,null);
string orderID = _workallOrder.EndInvoke(result);
这样去执行。
那么如果我想多个线程去执行的话,是不是写个for循环,然后把上面的代码放循环里就可以了?
当然传的参数(userid, pwd)肯定是不一样的。


1. 开通SVIP会员,免费下载本站所有源码,不限次数据,不限时间
2. 加官方QQ群,加官方微信群获取更多资源和帮助
3. 找站长苏飞做网站、商城、CRM、小程序、App、爬虫相关、项目外包等点这里
 楼主| 发表于 2014-2-13 14:19:43 | 显示全部楼层
[C#] 纯文本查看 复制代码
        private void AllSubmit_Click(object sender, EventArgs e)
        {
            
            List<string> userList = getUserInfo();
            //Thread[] threads = new Thread[10];
            for (int i = 0; i < userList.Count; i++)
            {
                _workallOrder = new WorkallOrder(worker.workAll);
                string userid = userList[i].Split(',')[0];
                string pwd = userList[i].Split(',')[1];
                IAsyncResult result = _workallOrder.BeginInvoke(userid, pwd, textBox2.Text,null,null);
                string orderID = _workallOrder.EndInvoke(result);

                this.BeginInvoke(_upDateMsg,orderID);
                Thread.Sleep(1000);
            }
        }


上面就是我批量下单的代码。根据取得的用户数来创建线程。worker.workAll类就是登陆啊,下单一系列操作。
_upDateMsg就是像飞哥你帖子里那样,对form上的richTextBox写信息。因为现在不知道 如何执行多个有返回值的函数,所以我把work类的登陆,下单写到一个方法(workAll)里去了。本意是想分开执行函数,把登陆,下单的信息都写到richTextBox中去的。

 楼主| 发表于 2014-2-13 14:56:38 | 显示全部楼层
我理了下思路,发现飞哥帖子里的列子是这样的。
1:主线程(form)里定义个委托1,定义一个方法methodA用来操作form1里的控件。
2:主线程(form)(一般按钮click事件),创建多个线程,去执行一个方法methodB,然后在这个方法中,把方法处理的实际结果(错的,正确的)信息,通过第一步定义的委托来处理,实时的显示到主线程form的控件中。

而我现在的代码,却反过来了。是取得开启线程执行的方法methodB的返回值,然后写到主线程中去。
应该是在开启的线程执行的方法中,像上面第一步一样,在线程中去调用主线程的定义的委托来更新控件信息吧。
那么这样的话,就有一个问题,因为我开启多线程执行的方法不是在form中,是在其他类里面的,怎么去取form中定义好的委托呢?难道new form? 这样感觉不太好啊
发表于 2014-2-13 15:39:31 | 显示全部楼层
怎么把From对象传过去就是了,传到线程中,为什么要New呢,NEw了,就是在现在的对象了,肯定不会有变化的,
参考这个http://www.sufeinet.com/thread-1273-1-1.html
 楼主| 发表于 2014-2-14 12:11:50 | 显示全部楼层
站长苏飞 发表于 2014-2-13 15:39
怎么把From对象传过去就是了,传到线程中,为什么要New呢,NEw了,就是在现在的对象了,肯定不会有变化的, ...

这想法,我怎么就没想到呢。。。确实不错。
 楼主| 发表于 2014-2-14 12:16:17 | 显示全部楼层
站长苏飞 发表于 2014-2-13 12:50
http://www.sufeinet.com/thread-13-1-1.html

关于线程,我还是有个地方不太明白,请指教下。
就是关于你帖子里开启多线程的地方,我写了个简单的列子,看看效果,发现2种写法得到的结果不一样。
方法1:就是你帖子里的写法
[C#] 纯文本查看 复制代码
        private void button1_Click(object sender, EventArgs e)
        {

            for (int i = 0; i < 100; i++ )
            {
                Thread Task = new Thread(new ThreadStart(delegate { settext(i.ToString()); }));
                Task.Start();
            }
        }

        private void settext(string msg)
        {
            this.richTextBox1.Invoke((Action)(() => this.richTextBox1.AppendText(msg.ToString() + "\r\n")));
            //this.richTextBox1.AppendText(msg.ToString() + "\r\n");
        }


结果:
2
2
3
4
6
7
7
8
10
11
12
12
13
15
15
18
18
19
20
22
22
23
24
25
25
27
27
29
30
31
32
32
34
35
35
37
37
40
41
41
42
42
43
45
46
47
48
49
50
51
52
52
54
55
56
57
58
59
60
61
62
63
64
66
66
66
67
68
69
70
72
73
74
75
75
76
78
79
81
82
82
83
84
85
85
86
88
88
90
91
91
93
93
95
95
97
97
99
100
100


方法2:
[C#] 纯文本查看 复制代码
        private void button1_Click(object sender, EventArgs e)
        {

            for (int i = 0; i < 100; i++ )
            {
                Thread Task = new Thread( new ParameterizedThreadStart(settext));
                Task.Start(i.ToString());
            }
        }

        private void settext(object msg)
        {
            this.richTextBox1.Invoke((Action)(() => this.richTextBox1.AppendText(msg.ToString() + "\r\n")));
            //this.richTextBox1.AppendText(msg.ToString() + "\r\n");
        }


得到结果
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
74
73
75
76
77
79
78
80
81
83
82
84
85
86
87
88
89
90
92
93
91
94
95
96
97
98
99



 楼主| 发表于 2014-2-14 12:19:23 | 显示全部楼层
搞不清楚的就是
Thread Task = new Thread(new ThreadStart(delegate { settext(i.ToString()); }));
Thread Task = new Thread( new ParameterizedThreadStart(settext));
有什么区别呢?ThreadStart是执行没参数的函数,ParameterizedThreadStart是执行有参数的。
ThreadStart执行的函数里 加个delegate 委托标识 就能传参数了?
而且2种写法的结果貌似也不一样,好像第二种,才正常点啊
发表于 2014-2-14 12:52:25 | 显示全部楼层
第一种建议使用,这种方法方便传参数,
 楼主| 发表于 2014-2-14 13:04:42 | 显示全部楼层
站长苏飞 发表于 2014-2-14 12:52
第一种建议使用,这种方法方便传参数,

不是啊,站长,我是想知道这2者写法的区别啊,特别是你的那种写法new ThreadStart(delegate XXX
是什么意思呢。一般不都是直接new ThreadStart(method名字)吗
而且2种写法结果都不一样啊
发表于 2014-2-14 13:12:42 | 显示全部楼层
zbsgift 发表于 2014-2-14 13:04
不是啊,站长,我是想知道这2者写法的区别啊,特别是你的那种写法new ThreadStart(delegate XXX
是什么 ...

没什么区别,都是一样的,只是第一种写法比较方便。建议使用第一种。第一种是使用委托的方法秋传值的。 这样可以直接调用方法,不公可以调用一个方法,还可以调用多个,只要都写在委托里就行。
你运行的效果吗,这个不好说,你再多运行几次看看。说不定不是因为这里出的问题
您需要登录后才可以回帖 登录 | 马上注册

本版积分规则

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

GMT+8, 2024-11-15 01:25

© 2014-2021

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