C#给线程传递数据
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#给线程传递数据的更多相关文章
- Java多线程初学者指南(7):向线程传递数据的三种方法
在传统的同步开发模式下,当我们调用一个函数时,通过这个函数的参数将数据传入,并通过这个函数的返回值来返回最终的计算结果.但在多线程的异步开发模式下,数据的传递和返回和同步开发模式有很大的区别.由于线程 ...
- InheritableThreadLocal类原理简介使用 父子线程传递数据详解 多线程中篇(十八)
上一篇文章中对ThreadLocal进行了详尽的介绍,另外还有一个类: InheritableThreadLocal 他是ThreadLocal的子类,那么这个类又有什么作用呢? 测试代码 p ...
- Java多线程初学者指南(8):从线程返回数据的两种方法
从线程中返回数据和向线程传递数据类似.也可以通过类成员以及回调函数来返回数据.但类成员在返回数据和传递数据时有一些区别,下面让我们来看看它们区别在哪. 一.通过类变量和方法返回数据 使用这种方法返回数 ...
- Java多线程:向线程传递参数的三种方法
在传统的同步开发模式下,当我们调用一个函数时,通过这个函数的参数将数据传入,并通过这个函数的返回值来返回最终的计算结果.但在多线程的异步开发模式下,数据的传递和返回和同步开发模式有很大的区别.由于线程 ...
- Android消息机制之实现两个不同线程之间相互传递数据相互调用
目的:实现两个不同线程之间相互传递数据相互调用方法. 线程一中定义mainHandler 并定义一个方法mainDecode 线程二中定义twoHandler 并定义一个方法twoEncode 实现当 ...
- Qt学习:线程间共享数据(使用信号槽传递数据,必须提前使用qRegisterMetaType来注册参数的类型)
Qt线程间共享数据主要有两种方式: 使用共享内存.即使用一个两个线程都能够共享的变量(如全局变量),这样两个线程都能够访问和修改该变量,从而达到共享数据的目的: 使用singal/slot机制,把数据 ...
- 在C#主线程和子线程将数据传递给对方如何实现
在C#中主线程和子线程怎样实现互相传递数据 老帅 在C#中创建线程Thread时,能够有多种方法,而主线程和子线程之间又怎样实现互相传递数据,每种创建方法传递參数的效果是不同的,逐一看一下: 一.不 ...
- Java并发:线程间数据传递和交换
转自:https://www.cnblogs.com/java-zzl/p/9741288.html 一.通过SynchronousQueue方式实现线程间数据传递: 线程A与线程B共同持有一个Syn ...
- 详解 Qt 线程间共享数据(使用signal/slot传递数据,线程间传递信号会立刻返回,但也可通过connect改变)
使用共享内存.即使用一个两个线程都能够共享的变量(如全局变量),这样两个线程都能够访问和修改该变量,从而达到共享数据的目的. Qt 线程间共享数据是本文介绍的内容,多的不说,先来啃内容.Qt线程间共享 ...
随机推荐
- HCNA Routing&Switching之动态路由基本概念
前文我们了解了静态路由的相关话题,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/14965433.html:今天我们来聊一聊动态路由相关概念: 首先我们要清楚什 ...
- python使用笔记23--面向对象编程
1.面向对象编程概念 面向对象是包含面向过程 面向过程编程 买车: 1.4s看车,买车 2.上保险 保险公司 3.交税 地税局 4.交管所 上牌 面向对象编程 卖车处: 1.4s 2.保险 3.交税 ...
- DEV C++自定义函数顺序与printf用法
#include <stdio.h> //int gys(int a,int b);//函数声明 int main() { int a = 520; int c1=98; int c2=5 ...
- Oracle中使用hash_hmac() 函数报错问题/以及Oracle遇到Oauth1.0授权和oauth_signature生成规则
最近在Oracle上发现使用hash_hmac()报找不到此函数.为此特意查到oracle的文档.详细请看官网回答:https://cx.rightnow.com/app/answers/detail ...
- java集合(2)-Collection与Iterator接口
1 package com.j1803.collectionOfIterator; 2 import java.util.ArrayList; 3 import java.util.Collectio ...
- shell脚本(3)-格式化输出
一个程序需要有0个或以上的输入,一个或更多输出 一.echo语法 1.功能:将内容输出到默认显示设备. echo命令功能在显示器上显示一段文字,一般提到提示的作用 2.语法:echo[-ne][字符串 ...
- Three.js-任意平面的镜像矩阵
1. 什么是镜像变换 直接看下面这张图: 这张图很好的诠释了镜像变化,关于y轴的变化,关于x轴的变化.这种关于任意轴的变化,就是镜像了. 2d下的镜像矩阵变化 我们以图像关于Y轴镜像为例子:原图形和结 ...
- Pytest单元测试框架之FixTure内置临时文件tmpdir操作
1.前言:某些接口需要引用上个接口返回的值,作为下个接口的入参,但笔者又不想在本地维护及创建此文件,此时引出fixture内置函数中的临时文件存储tmpdir 2.首先下面的源码是使用flask框架写 ...
- 第二十九篇 -- UDP和TCP
最近在写WIFI模块,所以就想明确一些TCP和UDP的区别,发现以前的理解还是有点误区.现在重新学习. 相同点 UDP协议和TCP协议都是传输层协议 TCP(Transmission Control ...
- (Opencv4)二值化图像
(Opencv4)二值化图像 ret, dst = cv2.threshold(src, thresh, maxval, type) threshold : 极限,临界值,阈值 ret: 一个数 s ...