在C#中主线程和子线程怎样实现互相传递数据

老帅

在C#中创建线程Thread时,能够有多种方法,而主线程和子线程之间又怎样实现互相传递数据,每种创建方法传递參数的效果是不同的,逐一看一下: 

一、不带參数创建Thread 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
using System; 
using System.Collections.Generic; 
using System.Text; 
using System.Threading; 
 
namespace ATest  
  class A  
  
     public static void Main() 
     
        Thread t = new Thread(new ThreadStart(A)); 
        t.Start(); 
 
        Console.Read(); 
      
 
      private static void A() 
      
         Console.WriteLine("不带參数 A!"); 
      
   
}

结果显示“不带參数 A!”

二、带一个參数创建Thread  

因为ParameterizedThreadStart要求參数类型必须为object,所以定义的方法B形參类型必须为object。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
using System; 
using System.Collections.Generic; 
using System.Text; 
using System.Threading; 
 
namespace BTest  
  class B
  
     public static void Main() 
     {  
        Thread t = new Thread(new ParameterizedThreadStart(B)); 
        t.Start("B"); 
 
        Console.Read(); 
      
 
      private static void B(object obj) 
      
        Console.WriteLine("带一个參数 {0}!",obj.ToString ());  
      
   
}

结果显示“带一个參数 B!”

三、带多个參数创建Thread  

因为Thread默认仅仅提供了这两种构造函数,假设须要传递多个參数。能够基于另外一种方法。将參数作为类的属性传给线程。


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
using System; 
using System.Collections.Generic; 
using System.Text; 
using System.Threading; 
 
namespace CTest  
  class C
  { 
     public static void Main() 
     { 
        MyParam m = new MyParam(); 
        m.x = 6; 
        m.y = 9; 
 
        Thread t = new Thread(new ThreadStart(m.Test)); 
        t.Start(); 
 
        Console.Read(); 
      } 
  } 
  
  class MyParam  
  { 
     public int x, y; 
 
     public void Test() 
     { 
         Console.WriteLine("x={0},y={1}", this.x, this.y); 
     } 
   } 
}

结果显示“x=6,y=9”

四、利用回调函数给主线程传递參数   
   我们能够基于方法三。将回调函数作为类的一个方法传进线程。方便线程回调使用。


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
using System; 
using System.Collections.Generic; 
using System.Text; 
using System.Threading; 
 
namespace CTest  
  class C
  { 
     public static void Main() 
     { 
        MyParam m = new MyParam(); 
        m.x = 6; 
        m.y = 9; 
        m.callBack = ThreadCallBack;
 
        Thread t = new Thread(new ThreadStart(m.Test)); 
        t.Start(); 
 
        Console.Read(); 
     } 
  } 
  private void ThreadCallBack(string msg)
  {
     Console.WriteLine("CallBack:" + msg);  
  }
 
  private delegate void ThreadCallBackDelegate(string msg);
  class MyParam  
  { 
     public int x, y; 
     public ThreadCallBackDelegate callBack;
 
     public void Test() 
     { 
        callBack("x=6,y=9"); 
     } 
   } 
}

结果显示“CallBack:x=6,y=9”

版权声明:本文博客原创文章,博客,未经同意,不得转载。

最新文章

  1. Taurus.MVC 2.2 开源发布:WebAPI 功能增强(请求跨域及Json转换)
  2. Eclipse切换SVN用户
  3. PHP中错误处理集合
  4. Codeforces Round #249 (Div. 2) A题
  5. 32.DDR2仿真结果
  6. java处理高并发高负载类网站的优化方法
  7. python 内置函数 getattr
  8. linux0.12 编译过程
  9. 深入浅出理解QTimeLine类
  10. SQL Server 2008备份数据库失败,拒绝访问的原因
  11. 转 :Vim文件编码识别与乱码处理
  12. Hi,WeTest限免开放Android Oreo云真机,Android 8.1可开测!
  13. PV和UV的简单记录
  14. nexus私服搭建及maven生命周期
  15. android sdk manager更新地址
  16. 剑指offer(52)正则表达式的匹配
  17. Percona XtraDB Cluster
  18. 8、JVM--虚拟机字节码执行引擎
  19. BDE 退出历史 迁移至FireDAC
  20. Python网络通信

热门文章

  1. 关于matlab矩阵卷积conv2和傅里叶变换求卷积ifft2的关系
  2. Java设置的读书笔记和集合框架Collection API
  3. UFLDL教程笔记及练习答案二(预处理:主成分分析和白化)
  4. String的split
  5. SWT中在treeview中显示图片
  6. 经常使用vi编辑命令
  7. 教你怎么去一个APP的JSON数据,你懂的
  8. JS类定义方式
  9. FZUOJ Problem 2178 礼品配送
  10. 入门git