真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

(十七)Async異步和多線程-語言進(jìn)階1-創(chuàng)新互聯(lián)

(十七)Async異步和多線程-語言進(jìn)階1
  • 一、進(jìn)程-線程-多線程,同步和異步
      • 1.概念
      • 2.同步和異步
      • 3.異步與多線程異同點(diǎn)
  • 二、委托啟動異步調(diào)用
      • 1.同步方法
      • 2.異步方法
  • 三、多線程的特點(diǎn)
  • 四、異步的回調(diào)和狀態(tài)參數(shù)
      • 1.順序控制
      • 2.狀態(tài)參數(shù)
  • 五、異步等待三種方式
      • 1. Thread.sleep等待
      • 2.asyncResult.AsyncWaitHandle.WaitOne()
      • 3.action.EndInvoke()
  • 六、異步返回值

站在用戶的角度思考問題,與客戶深入溝通,找到江津網(wǎng)站設(shè)計與江津網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個性化、用戶體驗(yàn)好的作品,建站類型包括:網(wǎng)站制作、成都網(wǎng)站設(shè)計、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、國際域名空間、網(wǎng)站空間、企業(yè)郵箱。業(yè)務(wù)覆蓋江津地區(qū)。一、進(jìn)程-線程-多線程,同步和異步 1.概念
  1. 進(jìn)程:進(jìn)程是一個程序運(yùn)行時,占用全部計算資源的總和,指在系統(tǒng)中正在運(yùn)行的一個應(yīng)用程序;程序一旦運(yùn)行就是進(jìn)程;或者更專業(yè)化來說:進(jìn)程是指程序執(zhí)行時的一個實(shí)例,即它是程序已經(jīng)執(zhí)行到課中程度的數(shù)據(jù)結(jié)構(gòu)的匯集。從內(nèi)核的觀點(diǎn)看,進(jìn)程的目的就是擔(dān)當(dāng)分配系統(tǒng)資源(CPU時間、內(nèi)存等)的基本單位。

  2. 線程:線程是程序執(zhí)行流的最小單位,系統(tǒng)分配處理器時間資源的基本單元,或者說進(jìn)程之內(nèi)獨(dú)立執(zhí)行的一個單元執(zhí)行流。任何操作都是由線程完成的;線程是依托于進(jìn)程存在的,一個進(jìn)程可以包含多個線程;線程也可以有自己的計算資源;
    進(jìn)程——資源分配的最小單位,線程——程序執(zhí)行的最小單位。

  3. 多線程:多個執(zhí)行流同時運(yùn)行。
    (1) CPU太快了,分時間片–上下文切換(加載環(huán)境–計算–保存環(huán)境)微觀角度,一個核同一時刻只能執(zhí)行一個線程;宏觀的來說是多線程并發(fā)
    (2) 名CPU多核可以獨(dú)立工作,例如我們常說的 “4核8線程”–其中核是物理的核 8線程是指虛擬核,并不是上述我們所說的線程。

  4. Thread:是c#語言對線程對象的封裝

2.同步和異步
  1. 同步:完成計算之后在進(jìn)入下一行
  2. 異步:不會等待方法的完成,會直接進(jìn)入下一行,不會阻塞。
    例如我們舉一個貼切的例子,
    同步:
    “你和朋友去吃飯,但他有點(diǎn)忙,你就等他忙完一起吃,這就是同步方法”
    異步:
    “你和朋友去吃飯,但他有點(diǎn)忙,你就自己先去吃,他忙完自己再去吃,這就是異步方法”
3.異步與多線程異同點(diǎn)
  1. 異步和多線程都可以達(dá)到避免調(diào)用線程阻塞的目的
  2. 異步操作在完成await操作后,會發(fā)出完成通知,并釋放占用的線程,之后系統(tǒng)調(diào)用線程池中空余的線程來進(jìn)行await之后的操作,減少了線程負(fù)擔(dān)。
  3. 而多線程編程會在整個任務(wù)中一直占用線程造成資源浪費(fèi)。比如DMA(直接存儲器訪問)操作,允許硬件可以不通過CPU而直接與內(nèi)存數(shù)據(jù)進(jìn)行交互,在這時閑置的線程無法被釋放,造成了資源浪費(fèi)。(使用異步可以避免)
二、委托啟動異步調(diào)用

下面我們可以通過一個示例看一下,分別執(zhí)行5次

1.同步方法

同步方法
在這里插入圖片描述

2.異步方法

異步方法
在這里插入圖片描述

當(dāng)我們調(diào)用同步方法時,程序是按照順序執(zhí)行,而下面的異步方法則是無序的,且執(zhí)行速度也比較快。
在這里插入圖片描述

三、多線程的特點(diǎn)

由上我們也可以看出同步和異步多線程方法的特點(diǎn)

  1. 同步方法卡界面,主(UI)線程忙于計算;
  2. 同步線程慢,因?yàn)橹挥幸粋€線程在干活;
  3. 異步多線程方法不卡界面,主線程計算完,計算任務(wù)就交給子線程在做;例如winform可以提升用戶體驗(yàn);
  4. 異步多線程方法快,因?yàn)槎鄠€線程并發(fā)運(yùn)算;
  5. 異步多線程無序:啟動無序,執(zhí)行時間不確定,結(jié)束也無序。
  6. 異步多線程并不是線性增長,而是資源換時間,但資源可能不夠,其次多線程也有管理成本;
  7. 線程可以加快速度,但不是越多越好

下圖可以清楚看到資源換時間的情況;
在這里插入圖片描述

四、異步的回調(diào)和狀態(tài)參數(shù) 1.順序控制

從上面的示例中我們使用了異步多線程方式解決了很多問題,但也發(fā)現(xiàn)了一個特殊情況,異步是無序的,這時候我們?nèi)绻胍刂祈樞蛞趺醋瞿亍_@個時候我們就可以使用回調(diào)的方式。
首先我們想在計算完成后,在完成后續(xù)動作,當(dāng)我們在BeginInvoke中設(shè)置后續(xù)兩個參數(shù)為null,可以看到下圖的執(zhí)行結(jié)果,我們的計算明明還沒有完成,確提示我們已經(jīng)完成了,只是主線程完成了??隙ú环衔覀兊慕Y(jié)果。
在這里插入圖片描述
在這里插入圖片描述
這時候我們把鼠標(biāo)放到BeginInvoke上可以發(fā)現(xiàn)框架已經(jīng)幫我們提供好了異步回調(diào)AsyncCallback
在這里插入圖片描述
我們可以看到AysncCallback是一個參數(shù)為IAsyncResult類型的委托
在這里插入圖片描述
接下來我們修改代碼把AsyncCallback傳進(jìn)來
在這里插入圖片描述
這時我們再看執(zhí)行結(jié)果,就可以看到我們結(jié)果實(shí)在最后輸出的。
在這里插入圖片描述
進(jìn)行到這里你會想知道這是為什么呢,這個步驟是怎么完成的,callback的參數(shù)ia是怎么回事?
在這里插入圖片描述
當(dāng)我們繼續(xù)把鼠標(biāo)方法BeginInvake上,我們會發(fā)現(xiàn)它其實(shí)是一個IAsyncResult類型
在這里插入圖片描述
你會發(fā)現(xiàn)這不是和上面AsyncCallback的參數(shù)ia是一樣的嗎,接下來我們做個驗(yàn)證

在這里插入圖片描述
結(jié)果返回True

在這里插入圖片描述
這時我們可以理解為,.net框架幫我們做了一個小封裝,在執(zhí)行BeginInvoke的時候會去申請一個線程,線程會先完成委托的調(diào)用,執(zhí)行完成后會產(chǎn)生一個IAsyncResult結(jié)果,最后把這個結(jié)果作為參數(shù)傳遞給AsyncCallback委托,這也就能解釋為什么BeginInvoke結(jié)果類型和AsyncCallback的參數(shù)類型是一致的。

2.狀態(tài)參數(shù)

接下來我們看BeginInvoke的第三個參數(shù),這時我們隨便傳入一個“hao”字符串。那么在AsyncState時我們就可以得到,這是為了我們在回調(diào)的時候如果想傳遞某些信息時使用。
在這里插入圖片描述

五、異步等待三種方式 1. Thread.sleep等待

這種情況我們可以使用asyncResult.IsCompleted來進(jìn)行判斷委托是否執(zhí)行完成。在執(zhí)行完成之后給用戶指定提示信息,如下為文件上傳操作的示例
在這里插入圖片描述
在這里插入圖片描述

但是這么寫是由弊端的就是會有延遲,也會卡主界面。優(yōu)點(diǎn)就是我們可以在等待的時候做一些其它操作,例如給用戶一些友好提示等。

2.asyncResult.AsyncWaitHandle.WaitOne()

信號量,即時等待

Console.WriteLine("Do Something Else.....");
Console.WriteLine("Do Something Else.....");
Console.WriteLine("Do Something Else.....");
asyncResult.AsyncWaitHandle.WaitOne();//等待任務(wù)的完成

也可以給asyncResult.AsyncWaitHandle.WaitOne(1000);設(shè)置等待時間做超時用,也叫做限時等待。

3.action.EndInvoke()

action.EndInvoke(asyncResult);
EndInvoke可以不僅等待也可以獲取返回值,接下來介紹怎么獲取返回值。

六、異步返回值

上述我們使用EndInvoke可以不僅等待也可以獲取返回值;如下我們可以看到結(jié)果正是我們設(shè)置的字符串
在這里插入圖片描述
在這里插入圖片描述
EndInvoke也可以寫在回調(diào)函數(shù)里面,方便我們獲取其結(jié)果值,但只能寫一次,寫在里面就不可以寫在外面了。
在這里插入圖片描述

你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧


名稱欄目:(十七)Async異步和多線程-語言進(jìn)階1-創(chuàng)新互聯(lián)
分享鏈接:http://weahome.cn/article/gheds.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部