c#如何使用反射去创建一个委托_【自学C#】|| 笔记 37 创建线程
一、Thread:线程及与线程有关的类
在 C# 语言中线程(Thread)是包含在进程中的,它位于 System.Threading 命名空间中。
与线程有关的类同样也都在 System.Threading 命名空间中,主要的类如下表所示。
类名 | 说明 |
---|---|
Thread | 在初始的应用程序中创建其他的线程 |
ThreadState | 指定 Thread 的执行状态,包括开始、运行、挂起等 |
ThreadPriority | 线程在调度时的优先级枚举值,包括 Highest、AboveNormal、Normal、BelowNormal、Lowest |
ThreadPool | 提供一个线程池,用于执行任务、发送工作项、处理异步I/O等操作 |
Monitor | 提供同步访问对象的机制 |
Mutex | 用于线程间同步的操作 |
ThreadAbortException | 调用Thread类中的Abort方法时出现的异常 |
ThreadStateException | Thead处于对方法调用无效的ThreadState时出现的异常 |
Thread 类主要用于实现线程的创建以及执行,其常用的属性和方法如下表所示。
属性或方法 | 说明 |
---|---|
Name | 属性,获取或设置线程的名称 |
Priority | 属性,获取或设置线程的优先级 |
ThreadState | 属性,获取线程当前的状态 |
IsAlive | 属性,获取当前线程是否处于启动状态 |
IsBackground | 属性,获取或设置值,表示该线程是否为后台线程 |
CurrentThread | 属性,获取当前正在运行的线程 |
Start() | 方法,启动线程 |
Sleep(int millisecondsTimout) | 方法,将当前线程暂停指定的毫秒数 |
Suspend() | 方法,挂起当前线程(已经被弃用) |
Join() | 方法,阻塞调用线程,直到某个线程终止为止 |
Interrupt() | 方法,中断当前线程 |
Resume() | 方法,继续已经挂起的线程(已经被弃用) |
Abort() | 方法,终止线程 |
二、ThreadStart:创建线程
在 C# 语言中使用线程时首先需要创建线程,在使用 Thread 类的构造方法创建其实例时,需要用到 ThreadStart 委托或者 ParameterizedThreadStart 委托创建 Thread 类的实例
ThreadStart 委托只能用于无返回值、无参数的方法,ParameterizedThreadStart 委托则可以用于带参数的方法。
本节主要介绍使用 ThreadStart 委托创建 Thread 类的实例,关于 ParameterizedThreadStart 委托我们将在下一节《C# ParameterizedThreadStart》中为大家讲解。
使用 ThreadStart 创建线程首先需要创建 ThreadStart 委托的实例,然后再创建 Thread 类的实例。
具体的代码如下。
ThreadStart ts = new ThreadStart( 方法名 ); Thread t = new Thread(ts);
1.例:
使用 ThreadStart 委托创建线程,并定义一个方法输出 0〜10 中所有的偶数。
根据题目要求,创建控制台应用程序,实现该程序的代码如下。
总之我使用的是这个:
using System;using System.Diagnostics;using System.Threading;namespace ConsoleApp1{ class Program { static void Main(string[] args) { ThreadStart ts = new ThreadStart(PrintEven); Thread t = new Thread(ts); t.Start(); } private static void PrintEven() { for (int i = 0; i <= 10; i = i + 2) { Console.WriteLine(i); } } }}
分析:
首先是追加一个包,using System.Threading;
然后先定义一个静态方法,PrintEven()
然后在Main()方法中运行。
总之首先是创建ThreadStart 委托实例,把自定义的方法委托进去。
再创建 Thread 类的实例。并通过Start()进行启动线程。
运行结果:
从上面的运行效果可以看出,使用 Threadstart 委托为 PrintEven 方法创建了线程,通过线程的 Start 方法启动线程并调用了 PrintEven 方法。
在一个应用程序中能同时启动多个线程,下面通过实例演示启动多个线程的效果。
2.例
在上一实例的基础上添加一个打印 1〜10 中的奇数的方法,再分别使用两个 Thread 类的实例启动打印奇数和偶数的方法。
using System;using System.Diagnostics;using System.Threading;namespace ConsoleApp1{ class Program { static void Main(string[] args) { ThreadStart ts1 = new ThreadStart(PrintEven); Thread t1 = new Thread(ts1); ThreadStart ts2 = new ThreadStart(PrintOdd); Thread t2 = new Thread(ts2); t1.Start(); t2.Start(); } private static void PrintEven() { for (int i = 0; i <= 10; i = i + 2) { Console.WriteLine(i); } } public static void PrintOdd() { for (int i = 1; i <= 10; i = i + 2) { Console.WriteLine(i); } } }}
分析:
其实就是进行两次委托,并启动进程。
从上面的运行效果可以看出,两个线程分别打印了 1〜10 中的奇数和 0〜10 中的偶数,但并不是按照线程的调用顺序先打印出所有的偶数再打印奇数。
需要注意的是,由于没有对线程的执行顺序和操作做控制,所以运行该程序每次打印的值的顺序是不一样的。
三、ParameterizedThreadStart:创建进程
在 C# 语言中使用 ParameterizedThreadStart 创建进程,首先需要创建 ParameterizedThreadStart 委托的实例,然后再创建 Thread 类的实例。
具体的代码如下。
ParameterizedThreadStart pts=new ParameterizedThreadStart( 方法名 ); Thread t=new Thread(pts);
1.例
创建一个方法输出0〜n的所有偶数,使用 ParameterizedThreadStart 委托调用该方法,并启动打印偶数的线程。
using System;using System.Diagnostics;using System.Threading;namespace ConsoleApp1{ class Program { static void Main(string[] args) { ParameterizedThreadStart pts = new ParameterizedThreadStart(PrintEven); Thread t = new Thread(pts); t.Start(10); } //打印0~n中的偶数 private static void PrintEven(Object n) { for (int i = 0; i <= (int)n; i = i + 2) { Console.WriteLine(i); } } }}
分析:
首先是通过ParameterizedThreadStart 方式创建进程委托的实例。
然后再创建 Thread 类的实例。
最后启动进程,并且提供参数。
需要注意的是,在使用 ParameterizedThreadStart 委托调用带参数的方法时,方法中的参数只能是 object 类型并且只能含有一个参数。
在启动线程时要在线程的 Start() 方法中为委托的方法传递参数。
如果需要通过 ParameterizedThreadStart 委托引用多个参数的方法,由于委托方法中的参数是 object 类型的,传递多个参数可以通过类的实例来实现。
下面通过实例来演示使用 ParameterizedThreadStart 委托引用多个参数的方法。
2.例
创建一个方法输出指定范围内数值的偶数,并创建线程调用该方法。
using System;using System.Diagnostics;using System.Threading;namespace ConsoleApp1{ class Program { static void Main(string[] args) { ParameterizedThreadStart pts = new ParameterizedThreadStart(PrintEven); ParameterTest pt = new ParameterTest(1, 10); Thread t = new Thread(pts); t.Start(pt); } private static void PrintEven(Object n) { //判断n是否为ParameterTest 类的对象 if (n is ParameterTest) { int beginNum = ((ParameterTest)n).beginNum; int endNum = ((ParameterTest)n).endNum; for (int i = beginNum; i <= endNum; i++) { if (i % 2 == 0) { Console.WriteLine(i); } } } } } public class ParameterTest { public int beginNum; public int endNum; public ParameterTest(int a, int b) { this.beginNum = a; this.endNum = b; } }}
分析:
这里先看34~43行的自定义构造类 ParameterTest。
也就是获取两个数,一个开始值,一个结束值。(也可以理解成最小值和最大值的区间。)
然后是14~32行,自定义的镜头方法。
主要是进行判断是否为ParameterTest 类的对象,以及以偶数进行输出。
最后是Main()方法里的内容。
先通过ParameterizedThreadStart 方式创建进程委托的实例。
这里要主要参数。
然后是自定义类的实例。
作为后期启动进行时的参数。
然后将创建的委托实例,传参进Thread类中。
其实这样,Thread类中就有了PrintEven方法中的功能。
最后在启动进程时,传入自定义实例的变量。
运行该程序,在控制台上将输出 1〜10 的偶数,即2、4、6、8、10。
从代码可以看出,通过为 ParameterTest 类中的字段赋值,并将其通过线程的 Start 方法传递给委托引用的方法 PrintEven,即可实现在委托引用的方法中传递多个参数的操作。
c#如何使用反射去创建一个委托_【自学C#】|| 笔记 37 创建线程相关推荐
- python中怎么创建一个词典_如何在Python中创建字典词典
所以我正在学习一个自然语言处理类,我需要创建一个trigram语言模型来生成随机文本,这些文本在一定程度上基于一些样本数据看起来"逼真". 根本需要创建一个"三元组&qu ...
- 创建python虚拟环境,安装django,创建一个django项目,在项目中创建一个应用(ubuntu16.04)...
一.创建python虚拟环境 首先,为什么要创建python的虚拟环境? 因为,在实际的项目开发中,每个项目使用的框架库并不一样,或使用框架的版本不一样,这样需要 我们根据需求不断的更新或卸载相应的库 ...
- 命令创建mysql数据库_怎么在命令行创建一个mysql数据库
哆啦的时光机 第一步:登陆到MySQL服务器 首先,你需要使用root用户登陆进你的MySQL数据库,如下: $ mysql -u root -h -p 请注意:为了能登进远程的MySQL服务器,你需 ...
- react中创建一个组件_如何使用React和MomentJS创建一个Countdown组件
react中创建一个组件 Recently I had to create a Countdown for one of my other projects, and I thought that i ...
- python虚拟环境中安装diango_创建python虚拟环境,安装django,创建一个django项目,在项目中创建一个应用(ubuntu16.04)...
一.创建python虚拟环境 首先,为什么要创建python的虚拟环境? 因为,在实际的项目开发中,每个项目使用的框架库并不一样,或使用框架的版本不一样,这样需要 我们根据需求不断的更新或卸载相应的库 ...
- java创建临时文件夹_如何在Java中创建一个临时目录/文件夹?
有没有在Java应用程序内部创建临时目录的标准可靠方法? Java的问题数据库中有一个条目,注释中包含一些代码,但是我想知道在一个常用的库(Apache Commons等)中是否找到标准解决方案? # ...
- 页面怎么创建一个数组_怎么创建一个企业网站?
怎么创建一个企业网站?互联网时代下,很多企业都纷纷搭建网站,网站不仅可以提高企业形象,还可以为企业带来盈利,那么怎么创建一个企业网站呢?下面小编来告诉你怎么搭建企业网站. 1.网站定位 做好企业网站建 ...
- python3怎么创建一个链表_怎么创建一个自己的微信公众号
随着移动互联网的发展,微信公众号这两年成为媒体传播的重要平台.平时我们每个人都会接触见到到各种非常好的微信公众号内容,碰到喜欢的有帮助的也会自觉的转发朋友圈或者群,分享给自己身边的人.于是很多人就想了 ...
- python定义一个列表_如何在Python中创建用户定义的列表?
你需要将怪物的数量发送给使用它的函数:def welcome(): number = monsters() print('Alright, ' + str(number) + ' monsters.' ...
最新文章
- 趣学python3(1)-f前缀格式化字符串文本
- 一套高可用、易伸缩、高并发的IM群聊架构方案设计实践
- python po设计模式_(Python)PO设计模式
- osg 三维gis开发_三维GIS平台的可视化应用 (下)
- 6599元!索尼Xperia 5 III国行版今日首销:媲美专业微单相机
- BZOJ5336 TJOI2018 party 【状压DP】*
- 全球自动驾驶第一梯队“成团出道”,谁站 C 位?
- 使用 v-cloak 防止页面加载时出现 vuejs 的变量名
- SPSS常见数据分析方法比较汇总
- uni-App 商品详情轮播图
- 基于Windows平台的Radius服务器搭建指南
- 做一个人脸识别相关的毕业设计
- 蓝桥旧题_剪邮票问题
- 华为数字化转型之道 实践篇 第六章 数字化重构业务运作模式
- 洛谷P3799 妖梦拼木棒 题解
- 逻辑仿真工具VCS的使用-Makefile
- HDU 1569 最大点权独立集
- 202012-5 星际旅行 C++暴力80分
- 你想要的宏基因组-微生物组知识全在这(2023.3)
- 深度学习训练营第6周好莱坞明星人脸识别