C#異步編程(一)

異步編程簡介

前言

本人學習.Net兩年有餘,是第一次寫博客,雖然寫的很認真,當畢竟是第一次,確定會有不少不足之處,
但願你們照顧照顧新人,有錯誤之處能夠指出來,我會虛心接受的。html

何謂異步

  • 與同步相對應,異步指的是讓CPU暫時擱置當前請求的響應,處理下一個請求,當經過輪詢或其餘方式獲得回調通知後,
    開始運行。多線程將異步操做放入另外一線程中運行,經過輪詢或回調方法獲得完成通知,可是完成端口,由操做系統接管
    異步操做的調度,經過硬件中斷,在完成時觸發回調方法,此方式不須要佔用額外線程。
  • 異步編程正在被使用的的愈來愈多,主要就是解決處理併發方面;那什麼是併發呢?併發指的就是某個時間段,多個用戶同時訪問
    形成的阻塞現象。不少人都有個誤解,以爲異步編程能縮短咱們處理某個任務的時間,其實並無.

異步與多線程的異同點

  • 二者均可以達到避免調用線程阻塞的目的,異步使用的是線程池中的線程,沒有額外的線程負擔,
    而且使用回調的方式進行處理,與普通人的思惟方式有些出入,並且難以調試。多線程的處理方式
    依然是順序執行,符合常人的思惟方式,因此編程較簡單,但會帶來額外的線程負擔,而且線程間
    的共享變量可能會形成死鎖的出現。並且線程也是對象也須要佔用內存,所以線程月多佔用內存也
    越多,多線程能縮短某個處理任務的時間,異步編程則不能。

理解多線程

  • 在某個時間段,也許咱們想縮短咱們處理某個任務的時間,這個時候毫不是使用
    異步,而是使用多線程。舉個例子,超市大減價期間去購物的話,每條結帳隊伍都會
    排了幾十人,假設你購物須要20分鐘,結帳就要排隊20分鐘,這樣你就要40分鐘才能
    購物完畢。這個時候就要開啓多線程,你叫你的朋友去結帳哪裏排隊,而你就去購物,
    這樣當你購完物時就恰好到你結帳的時候,這樣你就只須要20分鐘就能購物完畢,足足
    減小了20分鐘,這就是多線程編程

多線程擴展知識點

  • 多個線程之間經過搶得處理器時間來執行,例如,A線程執行300毫秒後,可能會輪到
    B線程執行,A線程會暫停(掛起);當B線程執行一段時間後,又輪到A線程繼續執行。因爲
    處理器時間片很短,人們很難察覺,好像某個線程一直在執行同樣.

爲何要使用異步編程

  • 在執行較爲耗時的操做時,很容易出現用戶界面卡頓現 ,用戶會覺得應用程序崩潰,從而將
    應用程序強制結束。這樣作會致使兩個結果:一是應用程序但願完成的操做沒法順利進行;
    二是可能會形成數據的丟失。因此在執行耗時操做時應當選擇異步編程,將耗時操做的代碼
    放到另外一個線程上執行,這樣不會阻塞用戶界面線程的繼續執行,用戶界面也不會卡頓,極大地
    提高用戶界面的響應速度,使用戶體驗度更好。

異步編程方案

  • 使用Thread類進行異步編程
  • 使用Task對象啓動異步操做
  • 異步等待語法(async/await)

關於異步爲何會跑在原始線程上?我的看法,有錯誤的話請園友們指出

  • await操做並無開啓新線程,只有遇到到Async方法纔會開啓,並把主線程返回給線程池中例如client.GetAsync()這類方法,
    當await操做等待GetAsync()完成後,會從線程池中隨機調出一個空閒線程繼續執行,這個線程有多是
    GetAsync()執行完後釋放掉的,也有多是以前的主線程或其餘線程,因此輸出的線程ID纔有可能全是主線程的ID。編程

  • 異步方法主要就是不讓線程池裏的線程閒着沒事幹,充分利用
  • async/await的介紹在下一篇博客異步編程系列(二)多線程

相關文章
相關標籤/搜索