首頁 後端開發 C#.Net教程 C#的多線程機制初探(3)

C#的多線程機制初探(3)

Dec 21, 2016 pm 03:00 PM

在這裡我們要注意的是其它線程都是依附於Main()函數所在的線程的,Main()函數是C#程式的入口,起始線程可以稱之為主線程,如果所有的前台線程都停止了,那麼主執行緒可以終止,而所有的後台執行緒都將無條件終止。而所有的線程雖然在微觀上是串行執行的,但是在宏觀上你完全可以認為它們在並行執行。

讀者一定注意到了Thread.ThreadState這個屬性,這個屬性代表了執行緒運行時狀態,在不同的情況下有不同的值,於是我們有時候可以透過對該值的判斷來設計程式流程。 ThreadState在各種情況下的可能取值如下:

Aborted:線程已停止 
AbortRequested:線程的Thread.Abort()方法已被調用,但是線程還未停止 
Background:線程在後台執行,與屬性Thread .IsBackground有關 
Running:執行緒正在正常運作 
Stopped:執行緒已經停止 
StoPRequested:執行緒正在正常運作 
Suspended:執行緒已經被掛起(在此狀態下,可以透過呼叫Resume()方法:執行緒正在要求被掛起,但是未來得及回應 
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#提供了一個關鍵字lock,它可以把一段程式碼定義為互斥段(critical section),互斥段在一個時刻內只允許一個執行緒進入執行,而其他執行緒必須等待。在C#中,關鍵字lock定義如下:

lock(expression) statement_block

 以上是C#的多執行緒機制初探(3)的內容,更多相關內容請關注PHPcn )! 


本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

使用 C# 的活動目錄 使用 C# 的活動目錄 Sep 03, 2024 pm 03:33 PM

使用 C# 的 Active Directory 指南。在這裡,我們討論 Active Directory 在 C# 中的介紹和工作原理以及語法和範例。

C# 序列化 C# 序列化 Sep 03, 2024 pm 03:30 PM

C# 序列化指南。這裡我們分別討論C#序列化物件的介紹、步驟、工作原理和範例。

C# 中的隨機數產生器 C# 中的隨機數產生器 Sep 03, 2024 pm 03:34 PM

C# 隨機數產生器指南。在這裡,我們討論隨機數產生器的工作原理、偽隨機數和安全數的概念。

C# 資料網格視圖 C# 資料網格視圖 Sep 03, 2024 pm 03:32 PM

C# 資料網格視圖指南。在這裡,我們討論如何從 SQL 資料庫或 Excel 檔案載入和匯出資料網格視圖的範例。

C# 中的階乘 C# 中的階乘 Sep 03, 2024 pm 03:34 PM

C# 階乘指南。這裡我們討論 C# 中階乘的介紹以及不同的範例和程式碼實作。

C# 中的模式 C# 中的模式 Sep 03, 2024 pm 03:33 PM

C# 模式指南。在這裡,我們討論 C# 中模式的介紹和前 3 種類型,以及其範例和程式碼實作。

c#多線程和異步的區別 c#多線程和異步的區別 Apr 03, 2025 pm 02:57 PM

多線程和異步的區別在於,多線程同時執行多個線程,而異步在不阻塞當前線程的情況下執行操作。多線程用於計算密集型任務,而異步用於用戶交互操作。多線程的優勢是提高計算性能,異步的優勢是不阻塞 UI 線程。選擇多線程還是異步取決於任務性質:計算密集型任務使用多線程,與外部資源交互且需要保持 UI 響應的任務使用異步。

C# 中的質數 C# 中的質數 Sep 03, 2024 pm 03:35 PM

C# 質數指南。這裡我們討論c#中素數的介紹和範例以及程式碼實作。

See all articles