本文主要介绍c#线程类用法的相关信息,帮助大家更好地理解和学习c#的相关知识。感兴趣的朋友可以了解一下。
Thread类对线程池中的线程有更多的控制权。这个类允许创建前台线程,设置线程优先级等。Thread类的构造函数被重载以接受ThreadStart和ParameterizedThreadStart类型的委托参数。
1、给线程传递数据
向线程传递数据的两种方式:
1.使用带有ParameterizedThreadStart委托参数的线程构造函数:
//定义数据类型并将其传递给线程
公共结构数据
{
公共字符串消息;
}
//创建一个方法,并将其赋予线程的ParameterizedThreadStart委托。
静态void ThreadMainWithParameters(对象对象)
{
数据d=(数据)obj
控制台。WriteLine('在线程中运行,收到{0} ',d . Message);
}
静态空干管()
{
Data d=新数据{ Message=' Info ' };//创建数据实例
Thread t2=新线程(ThreadMainWithParameters);//创建一个线程
t2。开始(d);//启动线程并传递参数
}
2.自定义一个类,将线程方法定义为实例方法,初始化实例的数据后再启动线程。
//定义一个类来存储线程需要的数据和启动线程的方法。
公共类MyThread
{
私有字符串数据;//线程数据
公共MyThread(字符串数据)
{
this.data=data
}
//线程开始方法
public void ThreadMain()
{
控制台。WriteLine('在线程中运行,数据:{0} ',数据);
}
}
静态空干管()
{
MyThread obj=new MyThread(' info ');//创建实例信息
线程t3=新线程(obj。thread main);//启动实例方法
t3。start();
}
2、后台线程
如果应用程序中的任何前台线程正在运行,则应用程序正在运行。Thread类创建的线程默认为前台线程,线程池中创建的线程为后台线程。使用Thread类创建线程时,可以设置IsBackground属性来设置创建的线程是后台线程还是前台线程。例如:
//创建一个线程方法在主线程中调用
静态void ThreadMain()
{
控制台。WriteLine(“线程{0}已启动”),线程。CurrentThread . Name);
线程。睡眠(3000);
控制台。WriteLine(“线程{0}已完成”),线程。CurrentThread . Name);
}
静态空干管()
{
线程t1=新线程(Thread main);t1。Name=' MyNewThread
t1。start();线程。睡眠(100);
控制台。WriteLine('主线程现在结束.');
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *,输出
*主线程现在结束.
*线程MyNewThread已完成
* *****************************************/
}
如您所见,主进程首先完成任务。然而,在主线程中启动的新线程是前台线程(默认),这导致新线程在主线程完成其任务后仍在写入控制台输出。如果线程的IsBackground属性在线程启动前设置为true,那么当主线程结束时,新线程的执行将被终止(无论任务是否完成)。
静态空干管()
{
线程t1=新线程(Thread main);
t1。Name=' MyNewThread
t1。IsBackground=true
t1。start();
线程。睡眠(100);
控制台。WriteLine('主线程现在结束.');
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *。
*线程MyNewThread已启动
*主线程现在结束.
* *****************************************/
}
后台线程适合完成后台任务。
3、线程的优先级
线程由操作系统调度。给线程分配优先级会影响线程的调度顺序。优先级越高,优先级越高,系统将被调度在CPU上运行。如果线程正在等待资源,它将停止运行并释放CPU。
线程必须等待的可能原因:响应睡眠指令、等待磁盘I/O完成、等待网络数据包到达等。如果一个线程不主动释放CPU,线程调度器将抢占该线程。一个线程可以持续使用CPU,直到时间到了(如果没有更高优先级的线程)。如果有多个优先级相同的线程在等待CPU,那么线程调度器会采用一种循环调度的原理,将CPU一个一个地交给各个线程。如果一个线程被其他线程抢占,它将排队到最后。
只有当具有相同优先级的多个线程同时运行时,才能使用时间量和循环规则。优先级是动态的:如果一个线程是CPU密集型的,每时每刻都需要CPU,不等待资源,那么它的优先级就降低到那个线程定义的基本优先级;如果一个线程正在等待资源,它的优先级将会增加。由于优先级的提高,线程可能在下一次等待结束时获得CPU。
线程的优先级属性可以设置线程的优先级。当指定线程优先级时,其他线程的运行概率可能会降低。因此,可以根据需要简单更改优先级。
4、控制线程
调用Thread对象的Start()方法创建一个线程。但是,新线程不是处于运行状态,而是处于未启动状态。当线程调度程序调用该线程时,该线程将变为运行状态。它的ThreadState属性可以获取线程的状态。
类的静态方法Sleep()会将线程置于WaitSleepJoin状态,等待一段时间后,线程会再次唤醒。
如果要停止线程,可以调用Abort()方法。调用此方法将在接收终止命令的线程中引发ThreadAbortException类型的异常。捕捉这个异常,你可以在线程结束前做一些清理工作。如果再次调用方法ResetAbort(),在收到异常后可能有机会继续运行。如果线程没有被重置,则接收到终止请求的线程的状态从AbortRequested变为Aborted。
调用Join()方法等待线程结束。此方法停止当前线程,并将其设置为WaitSleepJoin状态,直到加入的线程完成。
以上是c#线程类的使用细节。更多关于c#线程类的信息,请关注我们的其他相关文章!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。