首页 > 编程语言 >每个.NET开发都应掌握的C#多线程知识点

每个.NET开发都应掌握的C#多线程知识点

时间:2023-11-13 14:00:52浏览次数:37  
标签:知识点 C# 编程 线程 NET 多线程

上篇文章讲述了C#特性(Attribute)知识点,本文将介绍多线程的知识点。多线程编程是现代软件开发中的重要组成部分,它能够充分利用多核处理器,提高应用程序的性能和响应性。C#作为.NET开发的主要语言,提供了强大的多线程支持。本文将介绍C#多线程知识点,帮助.NET开发者更好地应对多线程编程。

1.多线程基础

1)进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,是系统进行资源分配和调度的一个独立单位。创建进程多用于桌面应用,web开发也可以创建但用的不多,可以用System.Diagnostics.Process类来创建和执行相关操作。

2)线程是进程的一个实体,是CPU调度和分派的基本单位,他是比进程更小的能独立运行的基本单位,线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),一个线程可以创建和撤销另一个线程;一个进程包含多个线程,但一个进程必须有一个线程。

3)多线程是一种并发编程的技术,它允许一个程序同时执行多个线程,每个线程都有自己的执行流程,但它们共享同一进程的内存空间。多线程的目的是提高程序的性能和响应性,特别是在多核处理器的计算机上。

4)线程池 是多个线程的集合,通过一定逻辑决定如何为线程分配工作。有任务要执行,它分配池中的一个工作者线程执行任务,并在任务结束后解除分配。

5)前台线程和后台线程

线程分后台线程和前台线程。后台线程与前台线程相同,只不过后台线程不会阻止进程终止。一旦属于进程的所有前台线程都终止,公共语言运行时将结束该进程。所有剩余的后台线程将停止,并且无法完成。

IsBackground=true设置为后台线程

默认情况下主线程(或主应用程序线程)和通过调用类构造函数创建 Thread 的所有线程为前台线程,这时候IsBackground为false;线程池线程和从非托管代码进入托管执行环境的所有线程为后台执行线程。

6)异步 是指任务的执行不必等待另一个任务的完成。在异步编程中,调用者在发起请求后可以立即返回,而无需等待请求的结果。线程是实现异步的一种方式,而异步编程是一种更高级的编程方式。在选择线程或异步时,需要根据具体的需求来决定。

7) C#多线程官网的解释

借助 .NET,可以编写同时执行多个操作的应用程序。可在单独的线程上执行可能妨碍其他操作的操作,这些线程是称为多线程处理或自由线程处理的进程 。

使用多线程处理的应用程序可以更快地响应用户输入,因为在单独的线程上执行处理器密集型任务时,用户界面将保持活动状态。创建可扩展的应用程序时,多线程编程也很有用,因为可以随着负载的增加添加线程。

8)C#创建并启动新线程

创建新线程可以通过System.Threading.Thread类的新实例来创建。如果启动可以调用Thread.Start方法。示例代码如下:

class Program
{
    static void Main()
    {
        Thread thread = new Thread(DoWork);
        thread.Start();
        thread.
    }
    static void DoWork()
    {
        // 在这里执行线程的工作
    }
}

9)停止线程

终止正在执行的线程可以使用System.Threading.CancellationToken。它提供了统一的方法以协作的方式停止线程。如果无法以协作的方法停止线程,在.NET Framework中使用Thread.Abort来引发ThreadAbortException从而销毁线程。开发人员应将Abort()作为万不得已的“终极招术”。理想情况是在整个AppDomain或整个进程被摧毁时才中断线程。.NET Core以上版本可以使用Process.kill方法终止线程。

2..多线程发展历程

1) Thread

是.NET Frameworkd 1.0版本就有的功能,命名空间:System.Threading。它是最基础开启线程的方式。

2)ThreadPool

线池是.NET Frameworkd 2.0推出的新特性,它的出现从某种意义上来改进了Thread的缺点。

3)Task

Task是.NET Frameworkd 4.0推出的新特性,被称为线程最佳实践,API也最多,Task的背后的实现也是使用了线程池线程。

  1. Parallel

并行编程是 .NET Framework 4.0 中发布的。它提供了一组类和接口,可以帮助您在 .NET 应用程序中实现并行编程。主要方法是Parallel.For和Parallel.Foreach.

5)await/async异步

await async是.NET4.5的新特征,是C#的语法糖,在.NET Core以上版本发扬光大了,可以说无处不在。它让程序员使用后端异步更加方便快捷。需要注意的是多线程是异步的实现方式。

-->详情:精:.NET多线程发展历程简介

3. 线程同步(Lock)

详细说明: 线程同步是确保多个线程安全访问共享资源的关键,lock关键字是一种常见的同步机制。

示例:

private static readonly object lockObject = new object();

lock (lockObject)
{
    // 在这里执行需要同步的代码块
}

4. 线程安全集合(Concurrent Collections)

详细说明: C#提供了线程安全的集合类,如ConcurrentDictionary,用于多线程环境中安全地操作集合数据。

示例:

using System.Collections.Concurrent;

ConcurrentDictionary<string, int> concurrentDict = new ConcurrentDictionary<string, int>();
concurrentDict["key"] = 42;

5. 并发集合(Concurrent Collections)

详细说明: .NET提供了多种并发集合,如ConcurrentBag,用于在多线程环境中安全地管理数据。

示例:

using System.Collections.Concurrent;

ConcurrentBag<int> concurrentBag = new ConcurrentBag<int>();
concurrentBag.Add(42);

6. 死锁避免(Deadlock Avoidance)

详细说明: 死锁是多线程编程中的常见问题,了解如何避免死锁以及如何处理死锁情况是重要的。

示例:

object lock1 = new object();
object lock2 = new object();

Task.Run(() =>
{
    lock (lock1)
    {
        // 执行操作1
        Task.Delay(100).Wait();
        lock (lock2)
        {
            // 执行操作2
        }
    }
});

Task.Run(() =>
{
    lock (lock2)
    {
        // 执行操作3
        Task.Delay(100).Wait();
        lock (lock1)
        {
            // 执行操作4
        }
    }
});

7.信号量

在c#中信号量,可以用线程之间的通讯,主要用来某一线程阻塞,然后由另一线程去进行发出信号,让阻塞的线程有信号量,从而继续执行,其中c#信号量主要分为:AutoResetEvent,ManualResetEvent,CountdownEvent,EventWaitHandle,Semaphore。

--->关于c#多线程中的几个信号量,面试会用到

8.线程安全

C# 线程安全是指在多个线程同时访问共享资源时,不会导致数据损坏或不一致。

1)在 C# 中,可以通过以下方式来实现线程安全:

使用同步机制:同步机制可以保证在同一时间只有一个线程可以访问共享资源。常用的同步机制包括:

互斥锁:互斥锁是一种最简单的同步机制,它可以保证在同一时间只有一个线程可以持有锁。

条件变量:条件变量可以用于等待某个条件满足时再进行操作。

读写锁:读写锁可以分离读操作和写操作,以提高并发效率。

使用线程池:线程池可以有效地管理线程,防止线程泄漏。使用线程安全的类和结构:.NET 提供了一些线程安全的类和结构,可以帮助开发人员避免编写线程不安全的代码。

2)在使用 C# 编写多线程程序时,应注意以下事项:

识别共享资源:在编写多线程程序时,应首先识别程序中所有需要共享的资源。

使用同步机制:对于需要共享的资源,应使用适当的同步机制来保证线程安全。

避免数据竞争:在编写多线程程序时,应避免在同一时间由多个线程修改同一个共享资源。

避免数据不一致:在编写多线程程序时,应注意在多个线程之间同步数据的状态。

避免线程死锁:在编写多线程程序时,应注意避免创建死锁的条件。

-->详情.NET常见线程安全问题及解决

结语

这些C#多线程知识点涵盖了多线程编程的关键概念和技术,掌握它们将帮助.NET开发者构建高性能、稳定的多线程应用程序。关于多线程知识点比较多,篇幅有限,本文只讲述了一些基础皮毛的东西,更多详情打开可以查看官方文档。

希望本文提供的C#多线程知识点对每个.NET开发者都有所帮助,对于C#多线程知识点,你还知道哪些?欢迎留言讨论或者吐槽本文。

参考:

1、微软官网:

learn.microsoft.com/zh-cn/dotnet/standard/threading

2、AI查询

1、.NET多线程下解决资源竞争的7种方法

2、探索C#中的多线程神器Monitor和Lock

3、.NET 6 多线程的几种打开方式

来源公众号:DotNet开发跳槽❀   

标签:知识点,C#,编程,线程,NET,多线程
From: https://www.cnblogs.com/xbhp/p/17828873.html

相关文章

  • DC电源模块的电阻或电位器对输出电压的调节
    BOSHIDADC电源模块的电阻或电位器对输出电压的调节DC电源模块是电子设备中广泛应用的一种电源模块,它能够将交流电转换为稳定的直流电,并为其他电路或设备提供所需的电源。在一些场合中,需要对DC电源模块的输出电压进行调节,这是通过电阻或电位器来实现的。DC电源模块中的电阻或电位......
  • Camstar Session 时间修改
    1、修改Portal应用池上的IdleTime-out时间,如下图: 2、修改CamstarPortal站点上的SessionState的时间,如下图:  3、修改ManagementStudio上Security上的IdleSessionTimeout的时间,如下图:注意:需要比以上修改的时间多10min ......
  • 手把手系列 - Ceph使用rbd及cephfs与k8s集群集成 - 三种方式实现
    前言本次详细部署k8s、ceph以及如何使用ceph作为k8s的外部存储。主机信息主机名IP说明信息k8s-master192.168.199.41k8smasterk8s-node01192.168.199.42nodek8s-node02192.168.199.43nodeceph-node01192.168.199.44ceph-node01-独立磁盘(/d......
  • vueCropper使用教程
    vueCropper使用教程1、使用步骤1.1、安装vue-croppernpminstallvue-croppermain.js里面使用importVueCropperfrom'vue-cropper'Vue.use(VueCropper)组件内使用import{VueCropper}from'vue-cropper'components:{ VueCropper}1.2、基本使用方法<!--外层......
  • Tesseract
    Tesseract.js使用教程1、安装tesseract.jsnpminstalltesseract.js2、在vue中引入tesseract.jsimportTesseractfrom'tesseract.js'3、调用recognize方法Tesseract.recognize(url,//表示图片路径'chi_sim',//表示识别的目标语言).then......
  • CentOS 7.9 防火墙启动报错--Process: 12848 ExecStart=/usr/sbin/firewalld --nofork
    原因:配置防火墙策略过程中,多次启停防火墙,导致防火墙启动报错报错截图: 排查:python版本是一致的,有一个遗留的防火墙进程防火墙正常关闭后没有这个进程 解决办法:杀掉这个进程,启动防火墙  ......
  • macOS系统IntelliJ IDEA安装 新手详细教程(全网最详细)
    1.安装地址:https://www.jetbrains.com/idea/download/?section=mac#section=windows 2.下载完成后,点击打开安装包,将安装包拖入Applications. 双击打开idea.同意协议.  3.进入后学生账号登录可以免费使用.或者淘宝购买激活码(有风险).支持正版! ......
  • USB(2.0 / Type-C) to MPSSE(JTAG / SPI / IIC) / UART / FIFO: FTDI 的FT4232H配成SP
    Ti60Demo板FT4232H串口使用易灵思FPGA技术交流2022-04-1508:43Ti60F225demo板使用的是FT4232H,有4个通道A,B,C和D。其中A通道用于SPI接口,可以是AS也可以是PS。通道B用于JTAG,通道C连接了UART,通道D连接了FX3。A,B,C和D四个通道分别对应Zadig中的TitraniumTi60F225develo......
  • Golang 中的 Context 包
    Golang中的Context包原创 Slagga 技术的游戏 2023-11-1212:28 发表于广东收录于合集#Golang89个简介今天,我们将讨论Go编程中非常重要的一个主题:context 包。如果你现在觉得它很令人困惑,不用担心—在本文结束时,你将像专家一样处理context!想象一下,你在一个......
  • 游记 CCPC2023 深圳站
    广东实验中学省实信奥2队https://vjudge.net/contest/59410511.11早上坐车打狼人杀。下午是开幕式,孙教授的口才真的不错,很好笑。然后是热身赛。15:30热身赛只有三个题。P9384[THUPC2023决赛]着色P9380[THUPC2023决赛]总投票数P9388[THUPC2023决赛]先人类......