.NET進階篇06-async異步、thread多線程1

知識須要不斷積累、總結和沉澱,思考和寫做是成長的催化劑web

異步多線程挺大一塊內容,既想拆開慢慢學,又想一股腦全倒出。糾結再三,仍是拆開吃透,也不至於篇幅過長,勸退許多人編程

本篇先作一個概述,列明一些基本概念安全

內容目錄

1、進程和線程一、進程二、線程多線程後臺線程三、簡言之四、適用場景2、同步和異步一、同步二、異步三、異步編程四、Async、Await五、異步操做優缺點3、小結服務器

1、進程和線程

一、進程

咱們打開計算機的任務管理器,會發現系統的不少個進程,每一個進程獨佔CPU、內存、磁盤、網絡等資源,是資源分配的最小單元。多個進程之間是資源隔離的,數據之間不能直接傳遞。一個exe運行一次就會產生一個進程,運行屢次就多個,但他們之間數據互相隔離網絡

二、線程

一樣在任務管理器中咱們也能看到線程,一個進程是由多個線程組成的,且至少是由一個線程,那就是主線程。圖中就能夠看到線程的數量要比進程大的多多線程

多線程

衡量一我的幹活快,要麼是一件事幹的很快,要麼是他能同時幹不少事。計算機就是如此,以單核CPU類比單我的,理論上單位時間上只能運行一個進程裏一個線程,只能幹一件事。但線程有可能在某些操做好比讀寫磁盤時會等待,這時候磁盤在瘋狂的運轉,CPU倒是閒置狀態,直到磁盤讀寫完成才CPU才繼續工做,因此空閒的這個時候它能夠先去幹別的事情,看起開就像單核它也能夠同時幹不少事app

一我的能夠把水壺燒上水的同時去拖地,同一時刻一我的是隻能幹一件事的,只是在快速的頻繁切換,拖地時一直想着水開了沒開了沒,但若是處理不當,多線程效率還低,就像你沒來及去倒已經燒開的水致使幹鍋,還有些任務同時起來更費時,就像你一邊拖地一遍廣播體操同樣,伸展運動123而後拖一下地,而後接着,唉?到哪裏了…異步

後臺線程

後臺線程不會阻止進程的關閉。當某個程序的全部前臺線程完成後,進程就終止程序退出了,固然後臺線程也會隨即中止。在.NET中用Thread建立的線程默認都是前臺線程,用線程池、BeginXXX等啓用的線程都是後臺線程async

三、簡言之

線程是獨立執行單元,同一段代碼(參數不一樣,任務不一樣)能夠交給多個線程去執行,從宏觀上看就是並行的執行,微觀上時間片上仍是串行執行的。但多核CPU就另說了,像多我的同樣,一我的負責作飯,一個負責拖地異步編程

多線能夠提升CPU的利用率,一個線程等待時,能夠先去執行其餘的任務,固然,線程之間的切換也是須要消耗資源的,開發複雜度也是會變大的,資源爭奪也須要作合理的控制,也並非全部的任務都適合多線程

四、適用場景

後臺執行耗時任務,前臺界面仍須要友好的展現。在WinForm中,若是單線程(也就是主線程)若是執行耗時的操做,那麼界面就會失去響應,它忙於後臺的任務,沒法更新用戶界面的交互。這個時候能夠另開一個工做線程來處理耗時的任務,主線程能夠響應用戶操做,也能夠隨時改變任務的狀態

在沒有界面的程序裏,當一個任務有潛在的耗時時,好比等待遠程服務器的響應返回,用工做線程來完成任務可讓主線程去作其餘事情

複雜的計算,多線程在多核CPU上能夠更快的完成任務。總之一切都是爲了效率,.NET中不少暗中的多線程,好比timer,backgroudworker,webservices等,咱們使用中天然而然就在利用其多線程帶來的好處,在瞭解了基本原理後,咱們須要手動建立管理明面上的多線程任務

多線程縱然能夠提升你的程序流暢度,但開發調試中確實增大了難度,一方面除了要對業務劃分適應多線程的處理模式,另外一個方面多線程最終仍是交於操做系統的調度,咱們雖能夠執行一些優化調度,但最終結果並非總盡人意,線程之間的切換也會消耗資源,因此多線程的設計應該儘可能簡單

2、同步和異步

一、同步

同步方法調用在程序繼續執行以前須要等待同步方法執行完畢返回結果,程序自上而下順序執行,沒完成一個指令,在進行下一個指令。在代碼調試的表現爲,光標一步一步完成上一步計算後,纔會進入下一行。阻塞調用線程的運行

二、異步

異步方法則在被調用以後,調用線程不會等待方法的完成,會直接進入下一行,執行下一個指令,因此是非阻塞

三、異步編程

.NET經過委託能夠實現異步調用任何方法。像上面介紹委託方法調用時,除了Invoke同步方法,還有BegInvoke異步方法,它會啓用一個異步調用線程,你只須要傳入委託方法的參數(可能還須要線程額外參數,若是有必要的話)就能夠之後臺線程的方式執行方法。在代碼上執行到BeginInvoke時,會當即返回,不等待異步調用的完成,它返回一個IAsyncResult類型,你能夠用它來監視調用的進度。和BegInvoke成對的EndInvoke方法能夠用於獲取異步調用的結果,這是會阻塞的。具體將在下一篇代碼實例中講解BeginInvoke的經常使用套路

四、Async、Await

Async、Await是.NET4.5新增的異步編程方式,爲了簡化異步程序的編寫。上面的說的異步調用方式就是經典的APM異步編程模型,基於IAsyncResult接口實現BeginXXX和EndXXX相似的方法。在.NET4.5中可使用Async方式,經過Async關鍵字標記方法爲異步方法,而後在方法內部經過await標記後面的方法耗時,調用線程到這裏就回去吧。咱們就能夠不用APM方式,用async方式能夠輕鬆將一個方法編程異步方法

public async void Async1()
{
    HttpWebRequest myReq = (HttpWebRequest)WebRequest.Create("http://cnblogs.com/");
    await myReq.GetRequestStreamAsync();
    //to do

五、異步操做優缺點

異步操做相比較於多線程,減小了死鎖的可能,在設計良好的狀況下,異步函數能夠沒必要使用共享變量,能夠減小出錯的概率。但起步也是難以調試的,只有儘可能減小其複雜度

3、小結

這篇主要介紹一些概念,接下來硬核編碼部分就不會再囉嗦這些,上面有遺漏的,在編碼中會捎帶一些。基本就這些吧,TaskFactory、ThreadPool、Task、Parallel等都是對Thread的封裝,過一遍代碼,瞭解經常使用方法套路就能夠。不會面面俱到每一個接口都試一下,微軟官網文檔更全面(吹一波,.NET微軟大佬的技術支持仍是槓槓的)。後面主要搞一些成熟的套路,好比線程的同步,線程取消,異常處理,線程安全、鎖機制等可用的編碼方式。

OK,那下期見,去給FPX打氣去,拜了個拜~

可關注主頁公號獲取更多

獸人永不爲奴

相關文章
相關標籤/搜索