[C# 线程处理系列]专题一:线程基础

本文深入探讨了C#中的线程概念,包括线程与进程的关系、线程调度、优先级设定、前台线程与后台线程的区别,以及如何在.NET环境中创建和使用线程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

[C# 线程处理系列]专题一:线程基础

引言:

最近一段时间都在研究关于.Net线程的内容,觉得线程是每个程序员都应该掌握的,所以写下这个线程的系列希望能给大家学习过程中一些帮助,同时也是自己对线程的巩固,当中如果有什么错漏还请大家指出,这样我们可以互相得到进步。

目录

一、线程的介绍

二、线程调度和优先级

三、前台线程和后台线程

四、简单线程的使用

 

 

一、线程的介绍

在介绍线程之前, 很有必要知道什么是进程,以及与线程的关系。

进程(Process)是应用程序的实例要使用的资源的一个集合(从可以简化理解:进程就是一种资源,是应用程序所用的资源)。每个应用程序都在各自的进程中运行来确保应用程序不受其他应用程序的影响,如果一个应用程序失败了, 只会影响自己的进程,其他进程中的应用程序可以继续运行。进程是操作系统为我们提供的一种保护应用程序的一种机制。

线程是进程中基本执行单元, 一个进程中可以包含多个线程,在进程入口执行的第一个线程是一个进程的主线程,在.Net应用程序中,都是以Main()方法作为程序的入口的, 所以在程序运行过程中调用这个方法时,系统就会自动创建一个主线程。(他们之间的关系简单说:线程是进程的执行单元,进程是线程的一个容器了)。

 

二、线程调度和优先级

Windows之所以被称为抢占式多线程操作系统,是因为线程可以在任意时间被抢占,并调度另一个线程。每个线程都分配了从0~31的一个优先级。系统首先把高优先级的线程分配给CPU执行。Windows 支持7个相对线程优先级:Idle,Lowest,Below Normal,Normal,Above Normal,Highest和Time-Critical,Normal是默认的线程优先级,然而在程序中可以通过设置Thread的Priority属性来改变线程的优先级,它的类型为ThreadPriority枚举类型,包含枚举有:Lowest,BelowNormal,Normal,AboveNormal和Highest,CLR为自己保留了 Idle和Time-Critical优先级。具体每个枚举值含义如下表

成员名称说明
Lowest可以将 Thread何其他优先级的线程之后。
BelowNormal可以将 Thread Normal 优先级的线程之后,在具有 Lowest 优先级的线程之前。
Normal

可以将 Thread AboveNormal 优先级的线程之后,在具有 BelowNormal 优先级的线程之前。

默认情况下,线程具有 Normal 优先级。

AboveNormal可以将 Thread Highest 优先级的线程之后,在具有 Normal 优先级的线程之前。
Highest可以将 Thread 其他优先级的线程之前。

 

 

 

 

 

 

 

三、前台线程和后台线程

在.net中线程分为前台线程和后台线程,在一个进程中,当所有前台线程停止运行时,CLR会强制结束仍在运行的任何后台线程,这些后台线程直接被终止,不会抛出异常。

所以我们应该在前台线程中执行我们确实要完成的事情,另外, 应该把非关键的任务使用后台线程,我们用Thread创建的是线程为前台线程。让我们通过下面的一段代码来看看前台线程和后台线成的区别:

using System;
using System.Threading;

 class Program
    {
        static void Main(string[] args)
        {
        // 创建一个新线程(默认为前台线程)
            Thread backthread = new Thread(Worker);

            // 使线程成为一个后台线程
            backthread.IsBackground = true;

            // 通过Start方法启动线程
            backthread.Start();

            // 如果backthread是前台线程,则应用程序大约5秒后才终止
            // 如果backthread是后台线程,则应用程序立即终止
            Console.WriteLine("Return from Main Thread");
        }
        private static void Worker()
        {
            // 模拟做10秒
            Thread.Sleep(5000);

            // 下面语句,只有由一个前台线程执行时,才会显示出来
            Console.WriteLine("Return from Worker Thread");
        }
}

运行上面代码可以发现:控制台中显示字符串: Return form Main Thread 后就退出了, 字符串 Return from Worker Thread字符串根本就没有显示,这是因为此时的backthread线程为后台线程,当主线程(执行Main方法的线程,主线程当然也是前台线程了)结束运行后,CLR会强制终止后台线程的运行,整个进程就被销毁了,并不会等待后台线程运行完后才销毁。如果把 backthread.IsBackground = true; 注释掉后, 就可以看到控制台过5秒后就输出 Return from Worker Thread。再在Worker方法最后加一句 代码:Console.Read();  就可以看到这样的结果了

注意:有些人可能会问我不想把 backthread.IsBackground = true;注释掉, 又想把Worker()方法中的字符串输出在控制台上怎么做呢? 其实是有解决的办法的, 我们可以调用thread.Join()方法来实现,Join()方法能保证主线程(前台线程)在异步线程thread(后台线程)运行结束后才会运行。

实现代码如下:

using System;
using System.Threading;
 class Program
    {
        static void Main(string[] args)
        {
 // 创建一个新线程(默认为前台线程)
            Thread backthread = new Thread(Worker);

            // 使线程成为一个后台线程
            backthread.IsBackground = true;

            // 通过Start方法启动线程
            backthread.Start();
            backthread.Join();

            // 模拟主线程的输出
            Thread.Sleep(2000);

            Console.WriteLine("Return from Main Thread");
            Console.Read();
        }

        private static void Worker()
        {
            // 模拟做3秒
            Thread.Sleep(3000); 

            // 下面语句,只有由一个前台线程执行时,才会显示出来
            Console.WriteLine("Return from Worker Thread");

        }
}

运行结果(调用Join方法后后台线程会阻塞主线程所以主线程会后输出):

 

 

四、简单线程的使用

其实在上面介绍前台线程和后台线程的时候已经通过ThreadStart委托创建了一个线程了,此时已经实现了一个多线程的一个过程,为此系列中将多线程也是做一个铺垫吧。下面通过ParameterizedThreadStart委托的方式来实现多线程。

ParameterizedThreadStart委托的方式来实现多线程:

using System;
using System.Threading;
 class Program
    {
        static void Main(string[] args)
        {
// 创建一个新线程(默认为前台线程)
            Thread backthread = new Thread(new ParameterizedThreadStart(Worker));

          
            // 通过Start方法启动线程
            backthread.Start("123");

            // 如果backthread是前台线程,则应用程序大约5秒后才终止
            // 如果backthread是后台线程,则应用程序立即终止
            Console.WriteLine("Return from Main Thread");
        }

        private static void Worker(object data)
        {
            // 模拟做5秒
            Thread.Sleep(5000);

            // 下面语句,只有由一个前台线程执行时,才会显示出来
            Console.WriteLine(data + " Return from Worker Thread");
            Console.Read();
        }
}

注意:此时Worker方法传入了一个参数,并且Start方法也传递了一个字符传参数。 对比与之前创建Thread的不同,

运行结果为:

 

写到这里, 本系列的第一篇差不多讲完了,在后续的文章将会介绍Thread方法的使用以及通过一些例子来展示他们的不同之处(像Abort()方法Interrupt方法等)对于线程的一些高级使用(如线程池,并行编程和PLINQ、线程同步和计时器)都会在后续中讲到。希望本系列可以给初学线程的人有所帮助。
 

posted @ 2012-07-18 13:59 Learning hard 阅读( ...) 评论( ...) 编辑 收藏
资源下载链接为: https://pan.quark.cn/s/abbae039bf2a 无锡平芯微半导体科技有限公司生产的A1SHB三极管(全称PW2301A)是款P沟道增强型MOSFET,具备低内阻、高重复雪崩耐受能力以及高效电源切换设计等优势。其技术规格如下:最大漏源电压(VDS)为-20V,最大连续漏极电流(ID)为-3A,可在此条件下稳定工作;栅源电压(VGS)最大值为±12V,能承受正反向电压;脉冲漏极电流(IDM)可达-10A,适合处理短暂高电流脉冲;最大功率耗散(PD)为1W,可防止器件过热。A1SHB采用3引脚SOT23-3封装,小型化设计利于空间受限的应用场景。热特性方面,结到环境的热阻(RθJA)为125℃/W,即每增加1W功率损耗,结温上升125℃,提示设计电路时需考虑散热。 A1SHB的电气性能出色,开关特性优异。开关测试电路及波形图(图1、图2)展示了不同条件下的开关性能,包括开关上升时间(tr)、下降时间(tf)、开启时间(ton)和关闭时间(toff),这些参数对评估MOSFET在高频开关应用中的效率至关重要。图4呈现了漏极电流(ID)与漏源电压(VDS)的关系,图5描绘了输出特性曲线,反映不同栅源电压下漏极电流的变化。图6至图10进步揭示性能特征:转移特性(图7)显示栅极电压(Vgs)对漏极电流的影响;漏源开态电阻(RDS(ON))随Vgs变化的曲线(图8、图9)展现不同控制电压下的阻抗;图10可能涉及电容特性,对开关操作的响应速度和稳定性有重要影响。 A1SHB三极管(PW2301A)是高性能P沟道MOSFET,适用于低内阻、高效率电源切换及其他多种应用。用户在设计电路时,需充分考虑其电气参数、封装尺寸及热管理,以确保器件的可靠性和长期稳定性。无锡平芯微半导体科技有限公司提供的技术支持和代理商服务,可为用户在产品选型和应用过中提供有
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值