永州网,内容丰富有趣,生活中的好帮手!
永州网 > 知识 > 正文

掌握C#多线程(二):线程操作技巧解析

时间:2024-03-01

在C#中,多线程编程是非常重要的技能,它可以帮助我们实现并发处理和提高程序的性能

友情提示:本文共有 2861 个字,阅读大概需要 6 分钟。

本文是C#多线程学习的系列文章的第二部分,将重点介绍如何操纵一个线程。在C#中,多线程编程是非常重要的技能,它可以帮助我们实现并发处理和提高程序的性能。本文将覆盖线程的创建、启动和终止,以及线程的同步和互斥操作。读者将学习如何控制线程的执行顺序,如何进行线程的等待和唤醒,并且了解线程的优先级和状态管理。通过本文的学习,读者将能够更好地理解和运用C#多线程编程相关的知识。

今天小编要跟大家分享C#多线程学习(二) 如何操纵一个线程,精心挑选的过程简单易学,喜欢的朋友一起来学习吧!

下面我们就动手来创建一个线程,使用Thread类创建线程时,只需提供线程入口即可。(线程入口使程序知道该让这个线程干什么事)

在C#中,线程入口是通过ThreadStart代理(delegate)来提供的,你可以把ThreadStart理解为一个函数指针,指向线程要执行的函数,当调用()方法后,线程就开始执行所代表或者说指向的函数。

打开你的,新建一个控制台应用程序( Application),编写完全控制一个线程的代码示例:

using System;

using ;

namespace ThreadTest

{

public class Alpha

{

public void Beta()

{

while (true)

{

Console.WriteLine("Alpha.Beta is running in its own thread.");

}

}

};

public class Simple

{

public static int Main()

{

Console.WriteLine("Thread Start/Stop/Join Sample");

Alpha oAlpha = new Alpha();

file://这里创建一个线程,使之执行Alpha类的Beta()方法

Thread oThread = new Thread(new ThreadStart(oAlpha.Beta));

oThread.Start();

while (!oThread.IsAlive)

Thread.Sleep(1);

oThread.Abort();

oThread.Join();

Console.WriteLine();

Console.WriteLine("Alpha.Beta has finished");

try

{

Console.WriteLine("Try to restart the Alpha.Beta thread");

oThread.Start();

}

catch (ThreadStateException)

{

Console.Write("ThreadStateException trying to restart Alpha.Beta. ");

Console.WriteLine("Expected since aborted threads cannot be restarted.");

Console.ReadLine();

}

return 0;

}

}

}

这段程序包含两个类Alpha和Simple,在创建线程oThread时我们用指向Alpha.Beta()方法的初始化了ThreadStart代理(delegate)对象,当我们创建的线程oThread调用oThread.Start()方法启动时,实际上程序运行的是Alpha.Beta()方法:

Alpha oAlpha = new Alpha();

Thread oThread = new Thread(new ThreadStart(oAlpha.Beta));

oThread.Start();

然后在Main()函数的while循环中,我们使用静态方法Thread.Sleep()让主线程停了1ms,这段时间CPU转向执行线程oThread。然后我们试图用Thread.Abort()方法终止线程oThread,注意后面的oThread.Join(),Thread.Join()方法使主线程等待,直到oThread线程结束。你可以给Thread.Join()方法指定一个int型的参数作为等待的最长时间。之后,我们试图用Thread.Start()方法重新启动线程oThread,但是显然Abort()方法带来的后果是不可恢复的终止线程,所以最后程序会抛出ThreadStateException异常。

主线程Main()函数

所有线程都是依附于Main()函数所在的线程的,Main()函数是C#程序的入口,起始线程可以称之为主线程。如果所有的前台线程都停止了,那么主线程可以终止,而所有的后台线程都将无条件终止。所有的线程虽然在微观上是串行执行的,但是在宏观上你完全可以认为它们在并行执行。

Thread.ThreadState 属性

这个属性代表了线程运行时状态,在不同的情况下有不同的值,我们有时候可以通过对该值的判断来设计程序流程。

ThreadState 属性的取值如下:

Aborted:线程已停止;

AbortRequested:线程的Thread.Abort()方法已被调用,但是线程还未停止;

Background:线程在后台执行,与属性Thread.IsBackground有关;

Running:线程正在正常运行;

Stopped:线程已经被停止;

StopRequested:线程正在被要求停止;

Suspended:线程已经被挂起(此状态下,可以通过调用Resume()方法重新运行);

SuspendRequested:线程正在要求被挂起,但是未来得及响应;

Unstarted:未调用Thread.Start()开始线程的运行;

WaitSleepJoin:线程因为调用了Wait(),Sleep()或Join()等方法处于封锁状态;

上面提到了Background状态表示该线程在后台运行,那么后台运行的线程有什么特别的地方呢?其实后台线程跟前台线程只有一个区别,那就是后台线程不妨碍程序的终止。一旦一个进程所有的前台线程都终止后,CLR(通用语言运行环境)将通过调用任意一个存活中的后台进程的Abort()方法来彻底终止进程。

线程的优先级

当线程之间争夺CPU时间时,CPU 是按照线程的优先级给予服务的。在C#应用程序中,用户可以设定5个不同的优先级,由高到低分别是Highest,AboveNormal,Normal,BelowNormal,Lowest,在创建线程时如果不指定优先级,那么系统默认为ThreadPriority.Normal。

给一个线程指定优先级,我们可以使用如下代码:

//设定优先级为最低

myThread.Priority=ThreadPriority.Lowest;

通过设定线程的优先级,我们可以安排一些相对重要的线程优先执行,例如对用户的响应等等。

收集不易,本文《掌握C#多线程(二):线程操作技巧解析》知识如果对你有帮助,请点赞收藏并留下你的评论。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。
显示评论内容(3)
  1. 余音绕梁2024-03-01 17:16余音绕梁[黑龙江省网友]103.41.24.180
    @科大新哥2011作者对C#多线程的操作技巧进行了系统的解析,让我受益匪浅,希望能继续深入探讨相关主题。
    顶15踩0
  2. 科大新哥20112024-03-01 16:54科大新哥2011[香港网友]157.156.114.248
    读完这篇文章后,我对C#多线程的操作技巧有了更清晰的认识,期待作者的更多精彩内容。
    顶5踩0
  3. 惜君2024-03-01 16:32惜君[湖南省网友]202.173.234.19
    这篇文章对C#多线程的操作技巧进行了深入解析,对我来说非常有帮助,感谢作者分享。
    顶1踩0
相关阅读
Java面试笔试题大全

Java面试笔试题大全

下面是小编收集整理的Java面试笔试题,希望对您有所帮助!Java面试笔试题1 什么是线程?线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位

2024-01-06 #知识

房山区教育系统倡导文明交通志愿服务 助力校园和谐发展

房山区教育系统倡导文明交通志愿服务 助力校园和谐发展

自9月起,区教委机关、区成教中心、北理工房山分校、少年宫、房山中学、城关小学、良乡三中、首都师范大学附属房山学校、阎村中心校9个单位,百余名教职工经过区级、校级多层次的...

2024-01-11 #生活

女演员扮演公安局长角色:挑战与成就

女演员扮演公安局长角色:挑战与成就

奚美娟 饰 公安局长奚美娟,1955年生于中国上海,毕业于上海戏剧学院表演系,中国影视女演员,国家一级演员,中央十七大、十八大党代表,第十届、十一届、十二届全国人大代表,...

2024-01-25 #百科

Web.2.0时代:探索Web.2.0英语短句的丰富例句大全

Web.2.0时代:探索Web.2.0英语短句的丰富例句大全

这本书籍从多个角度解读了Web 2.0时代的特点和趋势,同时提供了丰富的英语短句和例句,帮助读者更好地理解和运用英语表达

2024-02-03 #生活

使用荣耀20的操作指南和技巧手册

使用荣耀20的操作指南和技巧手册

本手册详细介绍了Honor 20的各项功能和操作方法,包括手机的基本设置、功能操作、应用程序的使用、常见问题解决等内容

2024-02-04 #百科

探讨JSP应用中的安全挑战与解决方案

探讨JSP应用中的安全挑战与解决方案

随着Web应用的普及和攻击技术的不断发展,JSP应用存在着诸多潜在的安全风险

2024-02-17 #生活

应对CPU使用率100%问题的解决方案及联想电脑的处理方法

应对CPU使用率100%问题的解决方案及联想电脑的处理方法

这种情况可能是由于过多的程序同时运行、恶意软件、底层系统故障等原因引起的

2024-02-24 #头条

Excel插件制作:从零开始的指南

Excel插件制作:从零开始的指南

通常,用户可以通过编程语言如VBAVisual Basic for Applications或C#来开发自己的Excel插件

2024-02-28 #头条

金山文档表格误操作怎么恢复?技巧分享

金山文档表格误操作怎么恢复?技巧分享

这时候,我们可以通过一定的方法来恢复丢失的表格数据

2024-02-29 #知识