.NET异步程序设计——给线程传递数据
2021-08-24 19:58
666 查看
目录
shanzm-2021年8月24日 19:51:26
0. 前情说明
首先我们都知道,创建一个线程执行一个无参函数,则方式如下:
//期望在线程中执行的函数 static void Do() { Console.WriteLine("Create Thread"); } //创建线程执行函数 static void Main(string[] ars) { Thread thread=new Thread(Do); thread.Start(); Console.ReadKey(); }
1. ParameterizedThreadStart类型的委托
使用以ParameterizedThreadStart
类型的委托为参数的Thread对象构造函数,并使用Thread.Start()来传递参数
这里首先说明一下,上文中示例,创建Thread对象,使用的构造函数的参数是
ThreadStart类型的委托
而Thread()方法在.net中有四个重载,我们可以使用其参数类型为
ParameterizedThreadStart类型的构造函数,实现线程中执行带参数的函数,即往线程中传递数据。
注意:
-
是使用
Thread.Start(object param)
传递参数的 -
ParameterizedThreadStart
类型的委托是:参数类型是object类型,无返回值的 -
因为
ParameterizedThreadStart
类型的委托的参数类型是object类型,所以我们需要修改期望在新线程中行的方法,将其参数改为object类型,在方法中使用时在进行拆箱
示例:
static void Do(object obj) { int n = (int)obj; Console.WriteLine($"方法1:新开线程执行方法,其参数是{n}"); } static void Main(string[] args) { Thread thread = new Thread(Do);//这里的Do函数就是ParameterizedThreadStart类型的委托 int n = 999; thread.Start(n);//在Start函数中传递参数 }
2. 使用自定义类
将方法封装在类中,则在自定义类实例化的时候,实现传递参数
这里我们依旧是使用Thread对象的参数类型为ThreadStart类型的构造函数,但是我们需要在新线程中执行的有参函数封装在一个类中
在类的实例化时,实现传递参数
示例:
有一个期望在新线程中执行的有参函数如下
pubic void Do(string param) { Console.WriteLine($"新开线程执行方法,其参数是{param}"); }
我们可以这样封装该方法,并在创建线程并执行该方法
public class MyClass { public int param { get; set; } public MyClass(int n) { this.param = n; } public void Do() { Console.WriteLine($"方法2:新开线程执行方法,其参数是{param}"); } } static void Main(string[] args) { MyClass myClass=new MyClass(999); Thread thread =new Thread(myClass.Do); }
3. 使用Lambda表达式
使用Lambda表达式调用期望在新线程中执行的函数
示例:
//期望在新线程中执行的方法 static void Do(int n, int m) { Console.WriteLine(n * m); } static void Main(string[] args) { Thread thread1 = new Thread(() => Do(2, 3));//定义一个Lambda表达式,调用Do()函数 thread1.Start(); //其实这里我们就是可以将所有的函数逻辑直接写在Lambda表达式中,从而更加方便 Thread thread2 = new Thread(() => { Console.WriteLine(2 * 3); }); thread2.Start(); }
4. 参考以及文中源代码下载
- 示例代码下载
- 《C#高级编程》
- 杨旭:C#异步编程基础
相关文章推荐
- Android 子线程中得到的键值对数组数据传递给主线程
- ThreadLocal父子线程之间的数据传递问题
- Android中webservice的简单使用以及使用handle在UI线程和子线程中传递数据
- Java 向线程传递数据
- Qt学习:线程间共享数据(使用信号槽传递数据,必须提前使用qRegisterMetaType来注册参数的类型)
- Java多线程初学者指南(7):向线程传递数据的三种方法
- Java线程7:线程数据传递
- 向线程传递数据的三种方法
- 进程间通信;进程间数据传递;线程间数据传递;java多线程学习
- 通过句柄将线程中的数据传递到Activity
- C#多线程开发3:给线程传递数据的两种方法
- Java多线程初学者指南(7):向线程传递数据的三种方法
- Java多线程:向线程传递数据的三种方法
- Java多线程:向线程传递数据的三种方法
- 初学Java多线程:向线程传递数据的三种方法
- 个人说说为什么线程之间的数据为什么要用委托传递
- Java多线程初学者指南(7):向线程传递数据的三种方法
- Java多线程初学者指南(7):向线程传递数据的三种方法
- (学)无论是CallContext还是HttpContext,都不能自动实现数据的跨线程传递?
- Java多线程初学者指南(7):向线程传递数据的三种方法