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#给线程传递数据的更多相关文章

  1. Java多线程初学者指南(7):向线程传递数据的三种方法

    在传统的同步开发模式下,当我们调用一个函数时,通过这个函数的参数将数据传入,并通过这个函数的返回值来返回最终的计算结果.但在多线程的异步开发模式下,数据的传递和返回和同步开发模式有很大的区别.由于线程 ...

  2. InheritableThreadLocal类原理简介使用 父子线程传递数据详解 多线程中篇(十八)

      上一篇文章中对ThreadLocal进行了详尽的介绍,另外还有一个类: InheritableThreadLocal 他是ThreadLocal的子类,那么这个类又有什么作用呢?   测试代码 p ...

  3. Java多线程初学者指南(8):从线程返回数据的两种方法

    从线程中返回数据和向线程传递数据类似.也可以通过类成员以及回调函数来返回数据.但类成员在返回数据和传递数据时有一些区别,下面让我们来看看它们区别在哪. 一.通过类变量和方法返回数据 使用这种方法返回数 ...

  4. Java多线程:向线程传递参数的三种方法

    在传统的同步开发模式下,当我们调用一个函数时,通过这个函数的参数将数据传入,并通过这个函数的返回值来返回最终的计算结果.但在多线程的异步开发模式下,数据的传递和返回和同步开发模式有很大的区别.由于线程 ...

  5. Android消息机制之实现两个不同线程之间相互传递数据相互调用

    目的:实现两个不同线程之间相互传递数据相互调用方法. 线程一中定义mainHandler 并定义一个方法mainDecode 线程二中定义twoHandler 并定义一个方法twoEncode 实现当 ...

  6. Qt学习:线程间共享数据(使用信号槽传递数据,必须提前使用qRegisterMetaType来注册参数的类型)

    Qt线程间共享数据主要有两种方式: 使用共享内存.即使用一个两个线程都能够共享的变量(如全局变量),这样两个线程都能够访问和修改该变量,从而达到共享数据的目的: 使用singal/slot机制,把数据 ...

  7. 在C#主线程和子线程将数据传递给对方如何实现

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

  8. Java并发:线程间数据传递和交换

    转自:https://www.cnblogs.com/java-zzl/p/9741288.html 一.通过SynchronousQueue方式实现线程间数据传递: 线程A与线程B共同持有一个Syn ...

  9. 详解 Qt 线程间共享数据(使用signal/slot传递数据,线程间传递信号会立刻返回,但也可通过connect改变)

    使用共享内存.即使用一个两个线程都能够共享的变量(如全局变量),这样两个线程都能够访问和修改该变量,从而达到共享数据的目的. Qt 线程间共享数据是本文介绍的内容,多的不说,先来啃内容.Qt线程间共享 ...

随机推荐

  1. python使用笔记002

    一.字符串常用方法 1 s = ' ha.hahaha.' 2 print(s.count('a'))#找某一个元素在字符串里出现的次数 3 print(s.index('a'))#找某一个元素的下标 ...

  2. python 按行查找文本文件,找出答案,并提示置顶答案

    1.整理好答案文件为文本文件:不能有空行:每个题干前有数字做为题号:每个题答案第一个字符为字母,答案占一行import time import time import sys import os im ...

  3. 成功解决1406, “Data too long for column ‘txt‘ at row 1“

    这是因为数据库里该字段的数据类型所给的数据空间太小.MySQL将截断超过指定列宽度的任何插入值.为了让这个不报错,可以尝试切换MySQL模式不使用严格模式. SET @@global.sql_mode ...

  4. sublime安装emmet

    1,先安装package install 2,然后安装emmet,安装完后会自动load加载Pyv8,如果加载不成功只能手动下载(详情可以百度).

  5. mybatis-4-Mapper映射文件

    Mapper映射文件 映射文件的Mapper标签包含标签 1.CDUS增删改查 2.参数处理 (1)直接传入参数 单个参数 //传入当个参数 public Employee getEmployeeBy ...

  6. MySQL检查与性能优化示例脚本

    最近在玩python,为了熟悉一下python,写了个mysql的检查与性能优化建议的脚本. 虽然,真的只能算是一个半成残次品.也拿出来现眼一下. 不过对于初学者来说,还是有一定的参考价值的.比如说如 ...

  7. 一定要收藏的5个优秀的SpringCloud开源项目

    上一期为大家推荐了几个前端模板,没看过的点下面 一定要收藏的5个后台管理系统的前端框架 今天再为大家推荐几个优秀的SpringCloud开源脚手架项目,开箱即用,不管是学习还是开发新项目,都非常不错. ...

  8. 关于 .NET 与 JAVA 在 JIT 编译上的一些差异

    最近因为公司的一些原因,我也开始学习一些 JAVA 的知识.虽然我一直是以 .NET 语言为主的程序员,但是我并不排斥任何其它语言.在此并不讨论 JAVA .NET 的好坏,仅仅是对 .NET 跟 J ...

  9. Python中调用Java程序包

    <原创不易,转载请标明出处:https://www.cnblogs.com/bandaobudaoweng/p/10785766.html> 开发Python程序,需求中需要用到Java代 ...

  10. .net 5+ 知新:【2】 .Net Framework 、.Net 、 .NET Standard的概念与区别

    作为了解历史和眼睛或者过程,我们需要将 .Net Framwork ..Net. .Net Stander几个概念进行下理解. .net 代表跨平台框架,从.net 5开始就统一叫.net,废弃原来的 ...