Linux C语言中的多线程参考这篇博客:https://www.cnblogs.com/Suzkfly/p/10388090.html
简单提一下,Linux C中用pthread_create函数,指定线程资源、线程属性、线程函数,以及给函数传递的参数,在C#中也是如此。
C#中用多线程需要引用:System.Threading;
需要构造一个Thread对象,Thread对象的构造方式有4种,如下:
public Thread(ThreadStart start); public Thread(ParameterizedThreadStart start); public Thread(ThreadStart start, int maxStackSize); public Thread(ParameterizedThreadStart start, int maxStackSize); |
第1种要传入一个ThreadStart类型的参数,ThreadStart的定义如下:
1 | public delegate void ThreadStart(); |
可见这是一个委托,类似于函数指针,而且没有参数,没有返回值,那么很显然,它其实就是线程的回调函数(方法)。
第2种构造方式是传入了一个ParameterizedThreadStart类型的参数,它的定义如下:
1 | public delegate void ParameterizedThreadStart( object obj); |
可见这是一个带有一个object类型的参数,无返回值的委托。
参见C语言中注册线程的回调函数的类型为:void *(*start_routine) (void *),这是一个返回值类型为void*型,并且带有一个void*型的参数的函数指针,这样传入的参数就可以是任意类型的指针,如果不使用参数的话,直接传入NULL即可。但是在C#中,用object类型代替了C语言中的void*类型,并且对构造函数重载,将带参和不带参区分开来。
第3和第4种构造方式是在前两种构造方式的基础上加入了一个int maxStackSize,用于指定该线程最大栈的大小。
那么创建一个线程的方式就很简单了。先定义回调函数(方法):
1 2 3 4 | static void test() { Console.WriteLine( "Hello" ); } |
然后:
1 | Thread thread = new Thread(test); |
或者:
1 | Thread thread = new Thread( new ThreadStart(test)); |
但是不像Linux C 中那样注册过后的线程自己会运行,在C#中需要调用thread.Start();线程才会运行。
开启一个线程,然后和Main里各自打印线程ID的程序如下:
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 | using System; using System.Threading; namespace Test { class Test { static void test() { while ( true ) { Console.WriteLine( "test Id = {0}" , Thread.CurrentThread.ManagedThreadId); Thread.Sleep(2000); } } static void Main( string [] args) { Thread thread = new Thread( new ThreadStart(test)); thread.Start(); while ( true ) { Console.WriteLine( "Main Id = {0}" , Thread.CurrentThread.ManagedThreadId); Thread.Sleep(2000); } } } } |
执行结果:
那么问题来了,如果传入的方法需要带参数该怎么办呢?这个时候看看thread.Start的声明:
1 2 | public void Start( object parameter); public void Start(); |
这个方法是经过重载的,它也可以带一个参数,这个参数就是传入给回调函数的参数,测试程序如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | using System; using System.Threading; namespace Test { class Test { static void test( object arg) { Console.WriteLine( "arg = {0}" , arg); } static void Main( string [] args) { Thread thread = new Thread( new ParameterizedThreadStart(test)); thread.Start(123); Console.ReadKey(); } } } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 【杂谈】分布式事务——高大上的无用知识?
2021-01-24 2、fork函数与进程ID
2019-01-24 九、编写led驱动
2019-01-24 八、启动linux内核并修改开机logo
2019-01-24 七、在U-boot中让LCD显示图片
2019-01-24 六、在U-boot中让LCD填充纯色