一、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 创建线程相关推荐

  1. python中怎么创建一个词典_如何在Python中创建字典词典

    所以我正在学习一个自然语言处理类,我需要创建一个trigram语言模型来生成随机文本,这些文本在一定程度上基于一些样本数据看起来"逼真". 根本需要创建一个"三元组&qu ...

  2. 创建python虚拟环境,安装django,创建一个django项目,在项目中创建一个应用(ubuntu16.04)...

    一.创建python虚拟环境 首先,为什么要创建python的虚拟环境? 因为,在实际的项目开发中,每个项目使用的框架库并不一样,或使用框架的版本不一样,这样需要 我们根据需求不断的更新或卸载相应的库 ...

  3. 命令创建mysql数据库_怎么在命令行创建一个mysql数据库

    哆啦的时光机 第一步:登陆到MySQL服务器 首先,你需要使用root用户登陆进你的MySQL数据库,如下: $ mysql -u root -h -p 请注意:为了能登进远程的MySQL服务器,你需 ...

  4. react中创建一个组件_如何使用React和MomentJS创建一个Countdown组件

    react中创建一个组件 Recently I had to create a Countdown for one of my other projects, and I thought that i ...

  5. python虚拟环境中安装diango_创建python虚拟环境,安装django,创建一个django项目,在项目中创建一个应用(ubuntu16.04)...

    一.创建python虚拟环境 首先,为什么要创建python的虚拟环境? 因为,在实际的项目开发中,每个项目使用的框架库并不一样,或使用框架的版本不一样,这样需要 我们根据需求不断的更新或卸载相应的库 ...

  6. java创建临时文件夹_如何在Java中创建一个临时目录/文件夹?

    有没有在Java应用程序内部创建临时目录的标准可靠方法? Java的问题数据库中有一个条目,注释中包含一些代码,但是我想知道在一个常用的库(Apache Commons等)中是否找到标准解决方案? # ...

  7. 页面怎么创建一个数组_怎么创建一个企业网站?

    怎么创建一个企业网站?互联网时代下,很多企业都纷纷搭建网站,网站不仅可以提高企业形象,还可以为企业带来盈利,那么怎么创建一个企业网站呢?下面小编来告诉你怎么搭建企业网站. 1.网站定位 做好企业网站建 ...

  8. python3怎么创建一个链表_怎么创建一个自己的微信公众号

    随着移动互联网的发展,微信公众号这两年成为媒体传播的重要平台.平时我们每个人都会接触见到到各种非常好的微信公众号内容,碰到喜欢的有帮助的也会自觉的转发朋友圈或者群,分享给自己身边的人.于是很多人就想了 ...

  9. python定义一个列表_如何在Python中创建用户定义的列表?

    你需要将怪物的数量发送给使用它的函数:def welcome(): number = monsters() print('Alright, ' + str(number) + ' monsters.' ...

最新文章

  1. 趣学python3(1)-f前缀格式化字符串文本
  2. 一套高可用、易伸缩、高并发的IM群聊架构方案设计实践
  3. python po设计模式_(Python)PO设计模式
  4. osg 三维gis开发_三维GIS平台的可视化应用 (下)
  5. 6599元!索尼Xperia 5 III国行版今日首销:媲美专业微单相机
  6. BZOJ5336 TJOI2018 party 【状压DP】*
  7. 全球自动驾驶第一梯队“成团出道”,谁站 C 位?
  8. 使用 v-cloak 防止页面加载时出现 vuejs 的变量名
  9. SPSS常见数据分析方法比较汇总
  10. uni-App 商品详情轮播图
  11. 基于Windows平台的Radius服务器搭建指南
  12. 做一个人脸识别相关的毕业设计
  13. 蓝桥旧题_剪邮票问题
  14. 华为数字化转型之道 实践篇 第六章 数字化重构业务运作模式
  15. 洛谷P3799 妖梦拼木棒 题解
  16. 逻辑仿真工具VCS的使用-Makefile
  17. HDU 1569 最大点权独立集
  18. 202012-5 星际旅行 C++暴力80分
  19. 你想要的宏基因组-微生物组知识全在这(2023.3)
  20. 深度学习训练营第6周好莱坞明星人脸识别

热门文章

  1. [导入]较为周全的Asp.net提交验证方案 (下)
  2. JavaScript动态设置table的高度
  3. 轻松为Windows系统快速配置多个网关
  4. 【BZOJ】4001: [TJOI2015]概率论
  5. Gingko——百度内网用于数据分发的P2P传输工具
  6. Grid++Report问题集!
  7. 安卓10省电还是费电_iOS 13省电教程:关掉这8个功能iPhone多用3小时
  8. 有哪些非关系型数据库
  9. 数据库与数据库管理系统的关系
  10. 缓冲池Buffer Pool