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

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

Dec 21, 2016 pm 02:58 PM

一.多執行緒的概念

Windows是一個多任務的系統,如果你使用的是windows 2000及其以上版本,你可以透過工作管理員查看目前系統運行的程式和進程。什麼是進程呢?當一個程式開始運行時,它就是一個進程,進程所指包括運行中的程式和程式所使用的記憶體和系統資源。而一個行程又是由多個執行緒所組成的,執行緒是程式中的一個執行流,每個執行緒都有自己的專有暫存器(棧指標、程式計數器等),但程式碼區是共享的,即不同的線程可以執行同樣的函數。多執行緒是指程式中包含多個執行流,即在一個程式中可以同時執行多個不同的執行緒來執行不同的任務,也就是說允許單一程式建立多個並行執行的執行緒來完成各自的任務。瀏覽器就是一個很好的多線程的例子,在瀏覽器中你可以在下載java小應用程式或圖象的同時滾動頁面,在訪問新頁面時,播放動畫和聲音,打印文件等。

多執行緒的好處在於可以提高CPU的利用率-任何一個程式設計師都不希望自己的程式很多時候沒事可幹,在多執行緒程式中,一個執行緒必須等待的時候,CPU可以運行其它的線程而不是等待,這樣就大大提高了程式的效率。

然而我們也必須認識到線程本身可能影響系統性能的不利方面,以正確使用線程:

線程也是程序,所以線程需要佔用內存,線程越多佔用內存也越多 
多線程需要協調和管理,所以需要CPU時間追蹤線程 
線程之間對共享資源的存取會相互影響,必須解決競用共享資源的問題 
線程太多會導致控制太複雜,最終可能造成很多Bug

基於以上認識,我們可以一個比喻來加深理解。假設有一個公司,公司裡有很多各司其職的職員,那麼我們可以認為這個正常運作的公司就是一個進程,而公司裡的職員就是線程。一個公司至少得有一個職員吧,同理,一個行程至少包含一個執行緒。在公司裡,你可以一個職員幹所有的事,但是效率很顯然是高不起來的,一個人的公司也不可能做大;一個程序中也可以只用一個線程去做事,事實上,一些過時的語言如fortune,basic都是如此,但是像一個人的公司一樣,效率很低,如果做大程序,效率更低——事實上現在幾乎沒有單線程的商業軟體。公司的職員越多,老闆就得發越多的薪水給他們,還得耗費大量精力去管理他們,協調他們之間的矛盾和利益;程序也是如此,線程越多耗費的資源也越多,需要CPU時間去追蹤線程,還得解決諸如死鎖,同步等問題。總之,如果你不想你的公司被稱為“皮包公司”,你就得多幾個員工;如果你不想讓你的程序顯得稚氣,就在你的程序裡引入多線程吧!

本文將對C#程式設計中的多執行緒機制進行探討,透過一些實例解決對執行緒的控制,多執行緒間通訊等問題。為了省去創建GUI那些繁瑣的步驟,更清晰地逼近線程的本質,下面所有的程序都是控制台程序,程序最後的Console.ReadLine()是為了使程序中途停下來,以便看清楚執行過程中的輸出。

好了,廢話少說,讓我們來體驗一下多線程的C#吧!

二.操縱一個線程

任何程式在執行時,至少有一個主線程,下面這段小程式可以給讀者一個直覺的印象:

[CODE] 
//SystemThread.cs 
[CODE] 
//SystemThread.cs 

. ; 

using System.Threading;

namespace ThreadTest 

  class RunIt 
  { 
  〠🀀 
    { 
      Thread.CurrentThread.Name="System Thread";//給當前執行緒命名為"System Thread" 
Console.WriteLine(Thread.CurrentThread.Name+"'Status:"+Thread.CurrentThread.ThreadState); 
 〔  } 

[/CODE]

編譯執行後你看到了什麼?是的,程式將產生以下輸出:

System Thread's Status:Running

在這裡,我們透過Thread類別的靜態屬性CurrentThread取得了目前執行的線程,對其Name屬性賦值“System Thread”,最後也輸出了它的當前狀態(ThreadState)。所謂靜態屬性,就是這個類別所有物件所公有的屬性,不管你創建了多少個這個類別的實例,但是類別的靜態屬性在記憶體中只有一個。很容易理解CurrentThread為什麼是靜態的-雖然有多個執行緒同時存在,但在某一個時刻,CPU只能執行其中一個。

就像上面程式所示範的,我們透過Thread類別來建立和控制執行緒。注意到程式的頭部,我們使用瞭如下命名空間: 
[CODE] 
using System; 
using System.Threading;

[/CODE] 
與多執行緒機制應用相關的類別都是放在System.Threading命名空間中的。其中提供Thread類別用於建立線程,ThreadPool類別用於管理線程池等等,此外還提供解決了線程執行安排,死鎖,線程間通訊等實際問題的機制。如果你想在你的應用程式中使用多線程,就必須包含這個類別。 Thread類別有幾個至關重要的方法,說明如下:

Start():啟動執行緒 
Sleep(int):靜態方法,暫停目前執行緒指定的毫秒數 
Abort():通常使用該方法來終止一個線程 
Suspend():該方法並未終止未完成的線程,它只是掛起線程,以後還可恢復。 
Resume():恢復被Suspend()方法掛起的線程的執行

 以上就是C#的多線程機制初探(1)的內容,更多相關內容請關注PHP中文網(www.php.cn)! 


本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡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脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
威爾R.E.P.O.有交叉遊戲嗎?
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++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:33 PM

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

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

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

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

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

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

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

See all articles