C 多執行緒程式設計(1) 執行緒,執行緒池和Task

2021-09-07 17:11:47 字數 1803 閱讀 4865

新開了乙個多執行緒程式設計系列,該系列主要講解c#中的多執行緒程式設計。    利用多執行緒的目的有2個: 一是防止ui執行緒被耗時的程式占用,導致介面卡頓;二是能夠利用多核cpu的資源,提高執行效率。

我沒有進行很深入的講解,是以實際使用為主。我的這個系列主要是《clr via c#》的總結,該書的作者jeffrey richter是c#的顧問,他本人對windows見解極深。尤其是多執行緒部分,書中講解的非常透徹,文中講解不到或者你想要更深入的了解的同學,可以找來《clr via c#》仔細研究。

當乙個會執行很長時間的程式,如從服務端獲取資料,當該程式執行過程中,客戶端一直處於等待狀態,等待該程式執行完成,然後再執行其他**。若是ui程式,使用者會感到介面卡頓,影響使用體驗。我們希望這樣卡頓的程式能夠「偷偷」在後台跑,不要影響到介面。解決這個問題就要使用多執行緒,其中一部分執行緒負責響應介面操作,另一部分執行緒負責後台計算。**如下: 

public void getdata()

public void loaddatafromserver()

thread就是你建立的執行緒,然後呼叫start()方法,該執行緒就會開始執行,loaddatafromserver()是你想要執行的方法,這裡是從服務讀取資料,windows會負責排程這個執行緒,決定這個執行緒什麼時候開始執行。這樣就可以做到新執行緒負責讀取資料,主線程不等待,繼續執行,介面不卡頓。這樣做很好,因為做到了非同步,介面很流暢,但是這不是最優解。當程式執行很長時間,每一次從服務端讀取資料,為了不造成介面卡頓,就要新建立個執行緒。當資料載入完成後,新執行緒就沒用了。建立乙個執行緒開銷很大(具體開銷就不介紹了,感興趣的可以上網查相關資料,《clr via c#》中有很詳細的介紹),如果每一次被建立的執行緒在執行結束後,不被釋放,而是存起來,留下一次使用,這樣是不是就可以節省資源?執行緒池就是幹這個的,例子如下:

//一些操作

threadpool.queueuserworkitem(()=>loaddatafromserver());

//其他操作

threadpool.queueuserworkitem()方法有乙個問題,那就是沒有很便捷的方法獲得方法的返回值,不知道loaddatafromserver()方法何時執行完成。為了解決這個問題,c#引入了task,和泛型task。**如下

var data = task.run(() => loaddatafromserver()).result;
先講解一下,task.run()是對threadpool.queueuserworkitem()方法的封裝,該方法會返回task,然後可以通過呼叫task.result來獲得loaddatafromserver()的返回值。實際上這段**並不會非同步執行,原因是data所在的執行緒會等待loaddatafromserver()的返回值,不然data會沒有值,程式無法執行,所以此時執行緒被阻塞,知道任務完成,該執行緒才會繼續執行。為了解決這一問題,c#引入了async 和 await 兩個關鍵字。**如下:

public async void loaddata()

public string loaddatafromserver()

c#規定只能在標有async的方法中使用await 關鍵字,該關鍵字會將await後面的**編譯成狀態機,在loaddatafromserver()方法執行結束後,程式會重新進入loaddata()方法,並從await處繼續執行,該關鍵字不會阻塞執行緒(編譯器如何將await的非同步方法編譯成狀態機,《clr via c#》28.4節有詳細講解)。

以上就是多執行緒程式設計的第一部分--thread, threadpool和task的講解,下一節會繼續講解task的其他特性與方法。

c 執行緒池 多執行緒

1。設定引數類 using system using system.collections.generic using system.text public class stateinfo 執行緒開啟方法類 using system using system.collections.generic ...

多執行緒和執行緒池

執行緒的建立 執行 銷毀三個階段中,只有執行狀態才在處理任務,所以我們希望花在建立和銷毀執行緒的資源越少越好,於是,為了省去了頻繁建立和銷毀執行緒的麻煩,就有了執行緒池。在開始就建立一定量的執行緒,批量處理任務,等不再需要執行緒的時候再銷毀。一.執行緒池簡介 二.執行緒池優缺點 執行緒池缺點 1 建...

多執行緒程式設計 執行緒池 threadpool

很多公司裡,雇員通常會在辦公室度過他們的辦公時光 偶爾也會外出訪問客戶或 商 或是參加 展會。雖然外出可能很有必要,並且可能需要很多人一起去,不過對於一些特別的雇員來說,一趟可能就是幾個月,甚至是幾年。公司要給每個雇員都配一輛車,這基本上是不可能的,不過公司可以提供一些共用車輛 這樣就會有一定數量車...