c# thread 参数,c++thread类,c# Thread类的用法详解

c# thread 参数,c++thread类,c# Thread类的用法详解

本文主要介绍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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

相关文章阅读

  • 设计一个简单的C#控制台应用程序,C#控制台程序,C# 创建控制台应用程序
  • 深入解析windows第8版,深入解析C#(第4版)
  • 数组代码,c# 数组操作,C# 数组实例介绍(图文)
  • 学会C#要多久,学会c#要多久,c#学习之30分钟学会XAML
  • 回溯法01背包问题c,回溯法求解01背包问题伪代码,C#使用回溯法解决背包问题实例分析
  • xml文件转义字符,xml转意字符,C# XML中的转义字符操作
  • winform 进度条控件,c# 进度条使用
  • winform 进度条控件,c# 进度条使用,C#使用winform实现进度条效果
  • winform backgroundworker,c# isbackground
  • winform backgroundworker,c# isbackground,C# BackgroundWorker用法详解
  • lua与c#交互,lua c#
  • lua与c#交互,lua c#,ToLua框架下C#与Lua代码的互调操作
  • linq c#,linq原理 c#
  • linq c#,linq原理 c#,c#中LINQ的基本用法实例
  • java decimal保留两位小数,sql中decimal函数保留2位小数,C#中decimal保留2位有效小数的实现方法
  • 留言与评论(共有 条评论)
       
    验证码: