每個.NET開發都應掌握的C#多線程知識點

来源:https://www.cnblogs.com/xbhp/archive/2023/11/13/17828873.html
-Advertisement-
Play Games

上篇文章講述了C#特性(Attribute)知識點,本文將介紹多線程的知識點。多線程編程是現代軟體開發中的重要組成部分,它能夠充分利用多核處理器,提高應用程式的性能和響應性。C#作為.NET開發的主要語言,提供了強大的多線程支持。本文將介紹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開發跳槽❀   

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1 簡介 SQLFlow 可跟蹤超過 20 種主要資料庫(包括 Snowflake、Hive、SparkSQL、Teradata、Oracle、SQL Server、AWS Redshift、BigQuery 等)的欄位級數據血緣。 從查詢歷史記錄、ETL 腳本、Github/Bitbucket、本 ...
  • 在 Go 語言中,零值(Zero Value)是指在聲明變數但沒有顯式賦值的情況下,變數會被自動賦予一個預設值。這個預設值取決於變數的類型,不同類型的變數會有不同的零值。零值是 Go 語言中的一個重要概念,因為它確保了變數在聲明後具有一個可預測的初始狀態,減少了未初始化變數引發的問題。 以下是一些常 ...
  • 公眾號「架構成長指南」,專註於生產實踐、雲原生、分散式系統、大數據技術分享。 概述 在之前的教程中,我們看到了使用 RestTemplate 的 Spring Boot 微服務通信示例。 從 5.0 開始,RestTemplate處於維護模式,很快就會被棄用。因此 Spring 團隊建議使用org. ...
  • 大家好,我是棧長。 昨天 17 點多,棧長興緻來了,忙裡偷閑正在看了一把 LOL S13 淘汰賽,沒想到比賽還沒看完朋友圈就已經炸鍋了: 朋友圈有人開玩笑說,阿裡 35 歲的人是不是都被優化了?還是雙 11 後都鬆懈了?這大周末的還讓加班?讓不讓人省心點。。 這我看完也有點懵 B ,大家還記得上次的 ...
  • 眾所周知,mybatisplus提供了強大的代碼生成能力,他預設生成的常用的CRUD方法(例如插入、更新、刪除、查詢等)的定義,能夠幫助我們節省很多體力勞動 ...
  • Docker在服務端的應用中已經非常廣泛,所以服務端項目支持Docker將是必不可少的存在,此篇講述如何講一個Rust項目發佈到Docker的公共鏡像里,以供他人使用 ...
  • 1.HighLightingSystem 用於3D物體高亮顯示 在項目中的使用方法:導入插件後在需要高亮顯示的3d物體上附加Highlighter組件,在需要顯示高亮效果的攝像機上附加Highlighting Renderer組件。在代碼中調整Highlighter屬性即可控制物體高亮效果的開關、閃 ...
  • 一:背景 1. 講故事 前幾天有位朋友找到我,說他的窗體程式有卡死現象,讓我幫忙看下怎麼回事,解決這種問題就需要在卡死的時候抓一個dump下來,拿到dump之後就可以分析了。 二:為什麼會卡死 1. 觀察主線程 窗體程式的卡死,需要觀察主線程此時正在做什麼,可以用 !clrstack 命令觀察。 0 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...