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. HCNA Routing&Switching之动态路由基本概念

    前文我们了解了静态路由的相关话题,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/14965433.html:今天我们来聊一聊动态路由相关概念: 首先我们要清楚什 ...

  2. python使用笔记23--面向对象编程

    1.面向对象编程概念 面向对象是包含面向过程 面向过程编程 买车: 1.4s看车,买车 2.上保险 保险公司 3.交税 地税局 4.交管所 上牌 面向对象编程 卖车处: 1.4s 2.保险 3.交税 ...

  3. DEV C++自定义函数顺序与printf用法

    #include <stdio.h> //int gys(int a,int b);//函数声明 int main() { int a = 520; int c1=98; int c2=5 ...

  4. Oracle中使用hash_hmac() 函数报错问题/以及Oracle遇到Oauth1.0授权和oauth_signature生成规则

    最近在Oracle上发现使用hash_hmac()报找不到此函数.为此特意查到oracle的文档.详细请看官网回答:https://cx.rightnow.com/app/answers/detail ...

  5. java集合(2)-Collection与Iterator接口

    1 package com.j1803.collectionOfIterator; 2 import java.util.ArrayList; 3 import java.util.Collectio ...

  6. shell脚本(3)-格式化输出

    一个程序需要有0个或以上的输入,一个或更多输出 一.echo语法 1.功能:将内容输出到默认显示设备. echo命令功能在显示器上显示一段文字,一般提到提示的作用 2.语法:echo[-ne][字符串 ...

  7. Three.js-任意平面的镜像矩阵

    1. 什么是镜像变换 直接看下面这张图: 这张图很好的诠释了镜像变化,关于y轴的变化,关于x轴的变化.这种关于任意轴的变化,就是镜像了. 2d下的镜像矩阵变化 我们以图像关于Y轴镜像为例子:原图形和结 ...

  8. Pytest单元测试框架之FixTure内置临时文件tmpdir操作

    1.前言:某些接口需要引用上个接口返回的值,作为下个接口的入参,但笔者又不想在本地维护及创建此文件,此时引出fixture内置函数中的临时文件存储tmpdir 2.首先下面的源码是使用flask框架写 ...

  9. 第二十九篇 -- UDP和TCP

    最近在写WIFI模块,所以就想明确一些TCP和UDP的区别,发现以前的理解还是有点误区.现在重新学习. 相同点 UDP协议和TCP协议都是传输层协议 TCP(Transmission Control ...

  10. (Opencv4)二值化图像

    (Opencv4)二值化图像  ret, dst = cv2.threshold(src, thresh, maxval, type) threshold : 极限,临界值,阈值 ret: 一个数 s ...