進(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)存等)的基本單位。
線程:線程是程序執(zhí)行流的最小單位,系統(tǒng)分配處理器時間資源的基本單元,或者說進(jìn)程之內(nèi)獨(dú)立執(zhí)行的一個單元執(zhí)行流。任何操作都是由線程完成的;線程是依托于進(jìn)程存在的,一個進(jìn)程可以包含多個線程;線程也可以有自己的計算資源;
進(jìn)程——資源分配的最小單位,線程——程序執(zhí)行的最小單位。
多線程:多個執(zhí)行流同時運(yùn)行。
(1) CPU太快了,分時間片–上下文切換(加載環(huán)境–計算–保存環(huán)境)微觀角度,一個核同一時刻只能執(zhí)行一個線程;宏觀的來說是多線程并發(fā)
(2) 名CPU多核可以獨(dú)立工作,例如我們常說的 “4核8線程”–其中核是物理的核 8線程是指虛擬核,并不是上述我們所說的線程。
Thread:是c#語言對線程對象的封裝
下面我們可以通過一個示例看一下,分別執(zhí)行5次
1.同步方法同步方法
異步方法
當(dāng)我們調(diào)用同步方法時,程序是按照順序執(zhí)行,而下面的異步方法則是無序的,且執(zhí)行速度也比較快。
由上我們也可以看出同步和異步多線程方法的特點(diǎn)
下圖可以清楚看到資源換時間的情況;
從上面的示例中我們使用了異步多線程方式解決了很多問題,但也發(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ù)類型是一致的。
接下來我們看BeginInvoke的第三個參數(shù),這時我們隨便傳入一個“hao”字符串。那么在AsyncState時我們就可以得到,這是為了我們在回調(diào)的時候如果想傳遞某些信息時使用。
這種情況我們可以使用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)查看詳情吧