如何在线程中给委托方法里的方法传参数
最近在优化我以前的项目时,需要在给原来的委托方法里的方法传递对象,而我要用这个对象来动态生成DataTable,运行时报错:“在某个线程上创建的控件不能成为在另一个线程上创建的控件的父级”。
所以我再次声明一个委托,然后我在方法里再次使用多线程,在这个线程中启动另一个方法来完成我要的工作,然后再次委托给另一个方法来实现。
说的我自己都晕了。。。还是用代码来说话吧。
看起来好像有些乱,有不懂的给我留言吧。
所以我再次声明一个委托,然后我在方法里再次使用多线程,在这个线程中启动另一个方法来完成我要的工作,然后再次委托给另一个方法来实现。
说的我自己都晕了。。。还是用代码来说话吧。
1public delegate void data_1Callback(DataTable dataTable); //委托操作DATATABLE
2
3Remote.RemoteServer.UserCome += new Remote.UserComeHandler(RemoteServer_UserCome);
4这个是刚启动时线程里方法的又一委托。
5
6 public void RemoteServer_UserCome(object o,string user,string userIP)
7 { stopThread(); //事先停止该线程
8 t = new Thread(new ThreadStart(BindDataGrid));
9 t.Start();
10
11 }
12
13 void stopThread()
14 {
15 if((t != null)&&(t.IsAlive))
16 {
17 t.Abort();
18 t.Join();
19 }
20 t = null;
21 }
22
23public void BindDataGrid()
24 {
25 if(dtUser.Rows.Count < 1)
26 {
27 ColId.DataType = System.Type.GetType("System.Int32");
28 dtUser.Columns.Add("ID");
29 ColDateTime.DataType = System.Type.GetType("System.String");
30 dtUser.Columns.Add("上线时间");
31 dtUser.Columns.Add("用户名");
32 dtUser.Columns.Add("当前状态");
33 dtUser.Columns.Add("退出时间");
34 dtUser.Columns.Add("外网IP");
35 dtUser.Columns.Add("内网IP");
36 }
37 count ++;
38 DataRow dr = dtUser.NewRow();
39
40 dr[0] = count;
41 dr[1] = DateTime.Now.ToString();
42 dr[2] = userName;
43 dr[3] = "在线";
44 dr[4] = "";
45 dr[5] = NetIp;
46 dr[6] = WokIp;
47
48 dtUser.Rows.Add(dr);
49
50dgUser.Invoke(new data_1Callback(data_1),new object[]{dtUser});
51 }
52
53private void data_1(DataTable dataTable)
54 {
55 try
56 {
57 this.dgUser.DataSource = dataTable;
58 this.dgUser.Refresh();
59 }
60 catch(Exception ex)
61 {
62 MessageBox.Show(ex.Message.ToString());
63 }
64 }
2
3Remote.RemoteServer.UserCome += new Remote.UserComeHandler(RemoteServer_UserCome);
4这个是刚启动时线程里方法的又一委托。
5
6 public void RemoteServer_UserCome(object o,string user,string userIP)
7 { stopThread(); //事先停止该线程
8 t = new Thread(new ThreadStart(BindDataGrid));
9 t.Start();
10
11 }
12
13 void stopThread()
14 {
15 if((t != null)&&(t.IsAlive))
16 {
17 t.Abort();
18 t.Join();
19 }
20 t = null;
21 }
22
23public void BindDataGrid()
24 {
25 if(dtUser.Rows.Count < 1)
26 {
27 ColId.DataType = System.Type.GetType("System.Int32");
28 dtUser.Columns.Add("ID");
29 ColDateTime.DataType = System.Type.GetType("System.String");
30 dtUser.Columns.Add("上线时间");
31 dtUser.Columns.Add("用户名");
32 dtUser.Columns.Add("当前状态");
33 dtUser.Columns.Add("退出时间");
34 dtUser.Columns.Add("外网IP");
35 dtUser.Columns.Add("内网IP");
36 }
37 count ++;
38 DataRow dr = dtUser.NewRow();
39
40 dr[0] = count;
41 dr[1] = DateTime.Now.ToString();
42 dr[2] = userName;
43 dr[3] = "在线";
44 dr[4] = "";
45 dr[5] = NetIp;
46 dr[6] = WokIp;
47
48 dtUser.Rows.Add(dr);
49
50dgUser.Invoke(new data_1Callback(data_1),new object[]{dtUser});
51 }
52
53private void data_1(DataTable dataTable)
54 {
55 try
56 {
57 this.dgUser.DataSource = dataTable;
58 this.dgUser.Refresh();
59 }
60 catch(Exception ex)
61 {
62 MessageBox.Show(ex.Message.ToString());
63 }
64 }
看起来好像有些乱,有不懂的给我留言吧。