上篇文章講述了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的背後的實現也是使用了線程池線程。
- 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。
8.線程安全
C# 線程安全是指在多個線程同時訪問共用資源時,不會導致數據損壞或不一致。
1)在 C# 中,可以通過以下方式來實現線程安全:
使用同步機制:同步機制可以保證在同一時間只有一個線程可以訪問共用資源。常用的同步機制包括:
互斥鎖:互斥鎖是一種最簡單的同步機制,它可以保證在同一時間只有一個線程可以持有鎖。
條件變數:條件變數可以用於等待某個條件滿足時再進行操作。
讀寫鎖:讀寫鎖可以分離讀操作和寫操作,以提高併發效率。
使用線程池:線程池可以有效地管理線程,防止線程泄漏。使用線程安全的類和結構:.NET 提供了一些線程安全的類和結構,可以幫助開發人員避免編寫線程不安全的代碼。
2)在使用 C# 編寫多線程程式時,應註意以下事項:
識別共用資源:在編寫多線程程式時,應首先識別程式中所有需要共用的資源。
使用同步機制:對於需要共用的資源,應使用適當的同步機制來保證線程安全。
避免數據競爭:在編寫多線程程式時,應避免在同一時間由多個線程修改同一個共用資源。
避免數據不一致:在編寫多線程程式時,應註意在多個線程之間同步數據的狀態。
避免線程死鎖:在編寫多線程程式時,應註意避免創建死鎖的條件。
-->詳情.NET常見線程安全問題及解決
結語
這些C#多線程知識點涵蓋了多線程編程的關鍵概念和技術,掌握它們將幫助.NET開發者構建高性能、穩定的多線程應用程式。關於多線程知識點比較多,篇幅有限,本文只講述了一些基礎皮毛的東西,更多詳情打開可以查看官方文檔。
希望本文提供的C#多線程知識點對每個.NET開發者都有所幫助,對於C#多線程知識點,你還知道哪些?歡迎留言討論或者吐槽本文。
參考:
1、微軟官網:
learn.microsoft.com/zh-cn/dotnet/standard/threading
2、AI查詢
來源公眾號:DotNet開發跳槽❀