C#異步編程(一)


異步編程簡介

前言

本人學習.Net兩年有余,是第一次寫博客,雖然寫的很認真,當畢竟是第一次,肯定會有很多不足之處,
希望大家照顧照顧新人,有錯誤之處可以指出來,我會虛心接受的。

何謂異步

  • 與同步相對應,異步指的是讓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的介紹在下一篇博客異步編程系列(二)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM