C#多线程 - 从简单和简单的步骤学习C#,从基本到高级概念,包括概述,环境设置,程序结构,基本语法,数据类型,类型转换,变量,常量,运算符,决策,循环,方法, ,数组,字符串,结构,枚举处理器,文件I / O,类,封装,接口,继承,命名空间,多态性,运算符重载,封装,反射,属性,属性,索引,代理,事件,集合,泛型,匿名方法,不安全代码,预处理器指令,多线程,正则表达式和异常处理。
线程被定义为程序的执行路径.每个线程都定义了一个独特的控制流.如果您的应用程序涉及复杂且耗时的操作,那么设置不同的执行路径或线程通常很有帮助,每个线程执行特定的工作.
线程轻量级进程.使用线程的一个常见示例是现代操作系统的并发编程的实现.使用线程可以节省CPU周期的浪费并提高应用程序的效率.
到目前为止,我们编写了程序,其中单个线程作为单个进程运行,该进程是应用程序的运行实例.但是,这样应用程序可以一次执行一个作业.为了使它一次执行多个任务,它可以分成更小的线程.
线程生命周期
生命周期线程在创建..类的对象时启动,在线程终止或完成执行时结束.
以下是线程生命周期中的各种状态&minus ;
死亡状态 : 这是线程完成执行或中止的情况.
主线程
在C#中, .. 类用于处理线程.它允许在多线程应用程序中创建和访问各个线程.在进程中执行的第一个线程称为 main 线程.
当C#程序开始执行时,将自动创建主线程.使用 类创建的线程称为主线程的子线程.您可以使用类的 属性访问线程.
以下程序演示主线程执行:
using System;using System.Threading;namespace MultithreadingApplication { class MainThreadProgram { static void Main(string[] args) { Thread th = Thread.CurrentThread; th.Name = "MainThread"; Console.WriteLine("This is {0}", th.Name); Console.ReadKey(); } }}
编译并执行上述代码时,会产生以下结果 :
This is MainThread
线程类的属性和方法
下表显示了线程类的一些最常用的属性 :
Sr.No.&说明
1
获取线程执行的当前上下文.
2
获取或设置当前线程的文化.
3
获取或设置线程的当前主体(基于角色的安全性).
4
获取当前正在运行的线程.
5
获取或设置资源管理器用于查找文化的当前文化 - 运行时的特定资源.
6
获取一个的对象关于当前线程的各种上下文的信息.
7
获取一个值,指示当前线程的执行状态.
8
获取或设置一个值,指示线程是否是后台线程.
9
获取一个值线程是否属于托管线程池.
10
获取当前托管线程的唯一标识符.
11
Name
获取或设置线程的名称.
12
获取或者设置一个表示线程调度优先级的值.
13
获取包含当前线程状态的值.
下表显示 中最常用的方法:
Sr.No .方法&说明
1
void Abort()
在调用它的线程中引发,以开始终止线程的过程.调用此方法通常会终止该线程.
2
()
在所有线程上分配一个未命名的数据槽.为了获得更好的性能,请使用标有e属性的字段.
3
t( name)
分配命名数据槽在所有线程上.为了获得更好的性能,请使用标有e属性的字段.
4
void ()
通知主机执行是关于进入代码区域,其中线程中止或未处理异常的影响可能会危及应用程序域中的其他任务.
5
void ()
通知主机托管代码即将执行依赖于当前物理操作系统线程标识的指令.
6
void ()
通知主机执行即将进入代码区域,其中线程中止或未处理异常的影响仅限于当前任务.
7
void ()
通知主机托管代码已完成执行依赖于当前物理操作系统线程标识的指令.
8
void ( name)
消除进程中所有线程的名称和插槽之间的关联.为了获得更好的性能,请使用标有e属性的字段.
9
( slot)
从中检索值当前线程在当前线程的当前域内指定的槽.为了获得更好的性能,请使用标有e属性的字段.
10
()
返回当前域当前线程正在运行.
11
()
返回唯一的应用程序域标识符
12
( name)
查找命名数据槽.为了获得更好的性能,请使用标有e属性的字段.
13
void ()
中断中的线程线程状态.
14
void Join()
阻止调用线程,直到线程终止,同时继续执行标准COM和抽取.此方法具有不同的重载形式.
15
void ()
按如下方式同步内存访问:执行当前线程的处理器无法重新排序指令以这种方式,在调用之前的内存访问在跟随对的调用之后的内存访问之后执行.
16
void ()
取消当前线程请求的中止.
17
void ( slot, data)
设置指定的数据当前正在运行的线程上的插槽,用于该线程的当前域.为了获得更好的性能,请使用标记为e属性的字段.
18
void Start()
启动一个帖子.
19
void Sleep(int )
使线程暂停一段时间.
20
void (int )
导致线程等待迭代参数定义的次数
21
byte (ref byte )
(ref )
int (ref int )
(ref )
读取一个字段的价值.该值是计算机中任何处理器写入的最新值,无论处理器数量或处理器缓存状态如何.此方法具有不同的重载形式.上面只给出了一些.
22
void (ref byte ,byte value)
void (ref , value)
void (ref int ,int value)
void (ref , value)
立即将值写入字段,以便该值对计算机中的所有处理器可见.此方法具有不同的重载形式.上面只给出了一些.
23
bool Yield()
使调用线程执行到另一个准备在当前处理器上运行的线程.操作系统选择要生成的线程.
创建线程
通过扩展类来创建线程.然后,扩展的类调用 Start()方法开始执行子线程.
以下程序演示了概念 :
using System;using System.Threading;namespace MultithreadingApplication { class ThreadCreationProgram { public static void CallToChildThread() { Console.WriteLine("Child thread starts"); } static void Main(string[] args) { ThreadStart childref = new ThreadStart(CallToChildThread); Console.WriteLine("In Main: Creating the Child thread"); Thread childThread = new Thread(childref); childThread.Start(); Console.ReadKey(); } }}
编译并执行上述代码时,会产生以下结果 :
In Main: Creating the Child threadChild thread starts
管理线程
类提供了各种管理线程的方法.
以下示例演示了如何使用 sleep() 使线程暂停一段特定时间的方法.
using System;using System.Threading;namespace MultithreadingApplication { class ThreadCreationProgram { public static void CallToChildThread() { Console.WriteLine("Child thread starts"); // the thread is paused for 5000 milliseconds int sleepfor = 5000; Console.WriteLine("Child Thread Paused for {0} seconds", sleepfor / 1000); Thread.Sleep(sleepfor); Console.WriteLine("Child thread resumes"); } static void Main(string[] args) { ThreadStart childref = new ThreadStart(CallToChildThread); Console.WriteLine("In Main: Creating the Child thread"); Thread childThread = new Thread(childref); childThread.Start(); Console.ReadKey(); } }}
编译并执行上述代码时,会产生以下结果 :
In Main: Creating the Child threadChild thread startsChild Thread Paused for 5 secondsChild thread resumes
销毁线程
Abort()方法用于销毁线程.
运行时通过抛出 来中止线程.无法捕获此异常处理器,控件将被发送到 块,如果有的话.
以下程序说明了这个 :
using System;using System.Threading;namespace MultithreadingApplication { class ThreadCreationProgram { public static void CallToChildThread() { try { Console.WriteLine("Child thread starts"); // do some work, like counting to 10 for (int counter = 0; counter <= 10; counter++) { Thread.Sleep(500); Console.WriteLine(counter); } Console.WriteLine("Child Thread Completed"); } catch (ThreadAbortException e) { Console.WriteLine("Thread Abort Exception"); } finally { Console.WriteLine("Couldn't catch the Thread Exception"); } } static void Main(string[] args) { ThreadStart childref = new ThreadStart(CallToChildThread); Console.WriteLine("In Main: Creating the Child thread"); Thread childThread = new Thread(childref); childThread.Start(); //stop the main thread for some time Thread.Sleep(2000); //now abort the child Console.WriteLine("In Main: Aborting the Child thread"); childThread.Abort(); Console.ReadKey(); } }}
编译并执行上述代码时,会产生以下结果 :
In Main: Creating the Child threadChild thread starts012In Main: Aborting the Child threadThread Abort ExceptionCouldn't catch the Thread Exception
有话要说...