天天躁日日躁狠狠躁AV麻豆-天天躁人人躁人人躁狂躁-天天澡夜夜澡人人澡-天天影视香色欲综合网-国产成人女人在线视频观看-国产成人女人视频在线观看

.NET中的異步編程(一)-為什么需要異步

  在2010年的PDC上,微軟發(fā)布了Visual Studio Async CTP,大大地降低了異步編程的難度,讓我們可以像寫同步的方法那樣去編寫異步代碼。Async CTP也在社區(qū)里掀起了不小的波瀾。在這之后,我也學(xué)習(xí)了一段時(shí)間,這個(gè)系列會(huì)將這段時(shí)間的學(xué)習(xí)作個(gè)梳理。

  好了,下面進(jìn)入本文的正題。

  為什么需要異步編程

  既然同步的寫法更自然簡單,異步的代碼(傳統(tǒng)的)不好寫,還容易出錯(cuò),那我們?yōu)槭裁葱枰ゾ帉懏惒降拇a呢?微軟還要費(fèi)這么大勁投入對(duì)Async CTP的開發(fā)呢?這其中肯定有一些原因。

  快速響應(yīng)的用戶界面

  作為電腦的資深用戶,我們肯定有多次“漏斗式鼠標(biāo)”,“轉(zhuǎn)圈式鼠標(biāo)”的體驗(yàn)吧。點(diǎn)擊一個(gè)按鈕,然后鼠標(biāo)就在那兒不停的轉(zhuǎn)圈,再在界面上點(diǎn)兩下,界面變灰,標(biāo)題欄上出現(xiàn)“沒有響應(yīng)”。然后我們束手無策,性子好點(diǎn)的就在那兒等待一會(huì)兒,看看能不能恢復(fù)過來;性子不好的就打開任務(wù)管理器殺掉進(jìn)程,殺掉進(jìn)程容易,但有可能會(huì)破壞重要數(shù)據(jù)。

  那造成這種情況到底是什么原因呢?概括成一句話就是:耗時(shí)的操作阻塞了UI線程,造成UI線程不能響應(yīng)用戶操作。關(guān)于更底層的原因請(qǐng)移步我的這篇文章:WinForm二三事(一)消息循環(huán)。那么這個(gè)時(shí)候我們就需要一種機(jī)制,在發(fā)起耗時(shí)操作的請(qǐng)求之后要立即返回,不要阻塞UI線程,讓UI線程可以繼續(xù)響應(yīng)用用戶的操作。然后等耗時(shí)操作返回后,通過回調(diào)來處理耗時(shí)操作返回的結(jié)果。下面是在UI上使用同步的方式和異步的方式的示意圖:

image

image

  更高的伸縮性

  對(duì)于服務(wù)器應(yīng)用來說,一般都是一個(gè)線程處理一個(gè)請(qǐng)求。另外一點(diǎn)是,線程的創(chuàng)建和銷毀是昂貴的(這一點(diǎn)可以參考《CLR via C#》中Thread Baisc一章的描述),而服務(wù)器的資源肯定是有限的;并且,線程創(chuàng)建的越多,線程上下文切換就會(huì)變得越頻繁。所以,為了創(chuàng)建高可伸縮性的服務(wù),我們必須用最少的線程處理更多的請(qǐng)求,這樣不僅能夠做到消耗更少的資源(創(chuàng)建更少的線程),而且在應(yīng)對(duì)請(qǐng)求突發(fā)增長的情況也很有用處,那么這里非常重要的一點(diǎn)就是不要阻塞線程,讓線程池能夠高效的工作。而且,在服務(wù)端應(yīng)用中,有非常多的IO操作:數(shù)據(jù)庫訪問,磁盤操作,Socket訪問等。對(duì)于這些IO操作,不屬于計(jì)算密集型操作,是不需要單獨(dú)分配一個(gè)線程來處理的。

  要做到高可伸縮性,異步是一劑良藥。假設(shè)現(xiàn)在這是一個(gè)web應(yīng)用,當(dāng)用戶的HTTP request到來時(shí),線程池提供一個(gè)線程來處理(忽略前面的排隊(duì)等過程),然后到某一點(diǎn),我們肯定需要讀取磁盤、訪問數(shù)據(jù)庫,這個(gè)時(shí)候我們使用異步的方式,發(fā)起IO請(qǐng)求,然后處理HTTP request的線程就可以返回到線程池了,它可以繼續(xù)處理其他請(qǐng)求,不需要在這里等待IO操作的返回。當(dāng)IO操作完成之后,會(huì)通過回調(diào)(具體實(shí)現(xiàn)方式請(qǐng)參照后續(xù)文章)完成剛才那個(gè)HTTP reqeust后續(xù)的處理。

  下面是使用同步方式和異步方式的示意圖:

image

  上圖只畫出了一個(gè)請(qǐng)求,高亮顯示的那一段其實(shí)是不需要占用線程的,其實(shí)這段時(shí)間該線程可以返回線程池,然后分配去做其他請(qǐng)求,而數(shù)據(jù)庫返回結(jié)果之后,再從線程池里分配一個(gè)線程來處理后續(xù)操作。這樣,如果請(qǐng)求多的話,線程池就會(huì)創(chuàng)建更多的線程來處理請(qǐng)求,最后結(jié)果大家應(yīng)該都知道了。

image

  從上圖可以看出,開始的時(shí)候來自線程池的thread1處理請(qǐng)求,然后發(fā)起對(duì)數(shù)據(jù)庫的請(qǐng)求,發(fā)起操作完畢后,thread1被線程池回收;當(dāng)數(shù)據(jù)庫將結(jié)果返回時(shí)線程池選擇另外一個(gè)線程thread2(有可能是原來的那個(gè)線程,如果空閑的話)來處理數(shù)據(jù)庫返回的結(jié)果,完成后續(xù)的操作。對(duì)于IO操作非常多的服務(wù)來說,所獲得的益處是不可估量的。

  后記

  本文主要從創(chuàng)建響應(yīng)靈敏的用戶界面和創(chuàng)建高可伸縮性的服務(wù)應(yīng)用這兩種不同的應(yīng)用場景來闡釋我們?yōu)槭裁葱枰惒健V劣谌绾芜M(jìn)行異步開發(fā)在后續(xù)的文章我會(huì)首先介紹傳統(tǒng)的異步和Async CTP以及F#中的Async Workflow。

NET技術(shù).NET中的異步編程(一)-為什么需要異步,轉(zhuǎn)載需保留來源!

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。

主站蜘蛛池模板: 麻豆精品无码久久久久久久久 | 亚欧免费观看在线观看更新 | 美国一级大黄一片免费的网站 | 国产精品无码人妻99999 | 双性大乳浪受噗呲噗呲h总 双性被疯狂灌满精NP | 亚洲色视在线观看视频 | 国产老师开裆丝袜喷水漫画 | 亚洲免费视频在线观看 | 欧美三级黄色大片 | 国产精品无码视频一区二区 | 奶头从情趣内衣下露了出来AV | 美国兽皇zoo在线播放 | 亚洲男人片片在线观看 | 樱桃BT在线观看 | 天天澡夜夜澡人人澡 | 97伦理电影在线不卡 | 久久婷婷五月综合色精品首页 | 美女脱18以下禁止看免费 | 国内精品日本久久久久影院 | 双性将军粗壮H灌满怀孕 | 一本道综合久久免费 | 久久偷拍免费2017 | 鸭子玩富婆流白浆视频 | 精品动漫国产亚洲AV在线观看 | 国产超碰人人爱被IOS解锁 | 亚洲精品久久久无码一区二区 | 久久夜色撩人精品国产 | 亚洲免费视频日本一区二区 | 最美女人体内射精一区二区 | 日韩免费一级毛片 | 免费精品一区二区三区AA片 | 99re在这里只有精品 | J午夜精品久久久久久毛片 jzz大全18 | asmr淫语 | 亚洲色欲啪啪久久WWW综合网 | 亚洲 欧美 中文 日韩 视频 | 夜夜躁婷婷AV蜜桃视频 | 韩日午夜在线资源一区二区 | 国产午夜精品理论片免费观看 | 色爱区综合激情五月综合激情 | 美女露出撒尿的部位 |