亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C# > 正文

C#5.0的新特性:異步編程

2023-05-17 11:41:54
字體:
供稿:網(wǎng)友

在即將到來的新的Windows Runtime(Windows 運(yùn)行時)中更根本地確定任何API都不會運(yùn)行超過50ms的時間。需要更長時間的操作將會由'kick off this operation'API來代替,不等待運(yùn)算結(jié)果就直接立刻返回。這樣做是因為微軟希望Windows8 Metro程序能夠在即時的觸控UI(用戶界面)上能夠“快速并且流動”,因為觸控操作上即使是微小的停頓相比于用鼠標(biāo)或者鍵盤來操作都會變得更加明顯。從UI的角度來說,這是一項很有幫助的設(shè)計方案。

但是從開發(fā)者的角度來說,它會使編程變得更加麻煩。當(dāng)我們讀取文件或者調(diào)用WCF服務(wù)時,我們通常希望能夠影響到結(jié)果。如果能夠保證讀取文件或者WCF服務(wù)返回時結(jié)果肯定可獲得的,我們由上而下地寫出容易理解和推理的代碼。

string url = ReadUrlFromFile(filename);
string contentOfUrl = HttpGetFromUrl(url);
MessageBox.Show(contentOfUrl);

這樣的API被叫做同步或者阻塞。同步API易于理解和使用,不過在你的程序內(nèi)部當(dāng)前線程沒有反應(yīng)時,API就無法控制你的代碼去做其它任務(wù),因為它還不能傳遞結(jié)果。

擁使用即時返回的'kick off' API的方式叫做異步或者無阻塞。使用異步API編程更加繁難,因為你不能即時將結(jié)果返回給變量來保證運(yùn)行:

string url = BeginReadUrlFromFile(filename); // Won't work -- file read hasn't completed when BeginRead returns
string contentOfUrl = BeginHttpGetFromUrl(url); // Ditto
MessageBox.Show(contentOfUrl);

相反,你不得不回調(diào)需要使用返回結(jié)果的代碼,直到它已經(jīng)準(zhǔn)備好了:

BeginReadUrlFromFile(filename, url => {
BeginHttpGetFromUrl(url, contentOfUrl => {
MessageBox.Show(contentOfUrl);
});
});

甚至于這樣一個簡單的例子都顯得相當(dāng)丑陋。實際上,異步代碼中需要更多的運(yùn)算,更復(fù)雜的回調(diào),邏輯條件,early exits以及錯誤處理,所以會更加難看。.NET框架中真正的異步API更加丑陋,到處都是 IAsyncResult對象和成對的EndXxx方法調(diào)用。

然而,如果我們希望能程序在Windows Runtime中運(yùn)行,這就是用戶所希望我們做的。

原來的解決方案:使用F#

F#背后聰明的人們想出來一個兩全其美的解決方案。F#有一個叫做異步工作流程的特色功能,它由很多塊異步引進(jìn)的代碼塊組成。在異步工作流程中,你可以通過使用一個很像同步的語法來調(diào)用異步方法:

async {
let! url = BeginReadUrlFromFile filename
let! contentOfUrl = BeginHttpGetFromUrl url
MessageBox.Show(contentOfUrl)
}

F#編譯器自動將這易于閱讀、理解的代碼轉(zhuǎn)變?yōu)榭膳碌幕卣{(diào)式等價物,這樣你就可以簡單地使用異步調(diào)用的響應(yīng)行為從上而下地編程。

新的解決方案:使用C# 5

C#背后也有同樣聰明的人,所以新的C#中也實現(xiàn)了這項功能。Visual Studio 11 beta中包含的下一版本的C#進(jìn)了兩個新關(guān)鍵字——"async" 和 "await"

關(guān)鍵字"async"表明使用的是異步調(diào)用方法。這對于調(diào)用者來說,理解它非常重要,因為這意味著方法會在它結(jié)束前返回——方法能夠在異步調(diào)用時中途放棄而直接返回給它的調(diào)用者。

關(guān)鍵字"await"表明我們希望保證自上而下的邏輯 異步調(diào)用 而不是手動編寫回調(diào)函數(shù)。下面是他們完美結(jié)合在一起的例子:

public async void ShowReferencedContent(string filename) {
string url = await BeginReadFromFile(filename);
string contentOfUrl = await BeginHttpGetFromUrl(url);
MessageBox.Show(contentOfUrl);
}

這樣比回調(diào)更方便讀、寫和檢查,但他們的作用完全相同。(實際上,這確實比回調(diào)更智能些,因為編譯器并不會因為厭煩而跳過錯誤狀況或者弄錯early exit邏輯又或者忽略線程錯誤。)

當(dāng)我們調(diào)用方法時發(fā)生了什么?首先是調(diào)用BeginReadFromFile方法,它提供了文件名和編譯器生成的回調(diào)。BeginReadFromFile迅速返回,但結(jié)果仍然不可得。所以結(jié)果仍然不能分配給URL變量——回調(diào)的一部分——然后方法退出,返回給調(diào)用者!調(diào)用函數(shù)重新運(yùn)行,并且保持它的代碼持續(xù)運(yùn)行,盡管被調(diào)用方法還沒有結(jié)束。

然后在晚點時候,文件系統(tǒng)完成了閱讀操作。這意味著結(jié)果現(xiàn)在是可獲得的,Runtime安排回調(diào)。這并不一定會立刻發(fā)生——具體的時間還依賴于同步的環(huán)境。回調(diào)函數(shù)運(yùn)行著,捆將URL變量和文件操作的結(jié)果綁定,然后調(diào)用BeginHttpGetFromUrl。它也會立刻返回,也就是說,方法會再一次退出。

最后,HTTP操作完成,回調(diào)函數(shù)第二次運(yùn)行。它將綁定Url變量的內(nèi)容和顯示結(jié)果的消息框如果(如果有的話)。

我會希望向調(diào)用者返回什么值?

Async methods can exit before they’ve finished. So if an async method wants to return a result, it has to recognise that it might return to the caller before that result is available. For this reason, an async method that returns a value has to have a return type of Task rather than a ‘proper’ value. A Task represents a chunk of work which will eventually deliver a value, so a caller can examine the returned Task to determine when the result becomes available. Here’s how an async method looks when returning a value:

異步方法能夠在結(jié)束前退出,所以,如果一個異步方法希望返回一個結(jié)果就不得不確認(rèn)它是否在得到結(jié)果前就返回給調(diào)用者。因此,一個返回值的異步方法不得不包含一個Task返回類型而不是一個“合適的”值。一個Task代表最終會傳遞值的很大一塊工作,所以調(diào)用者也能堅持返回的Task來確定什么時候會得到結(jié)果。下面是一個返回值的異步方法的樣子:

public static async Task<string> GetReferencedContent(string filename)
{
  string url = await BeginReadFromFile(filename);
  string contentOfUrl = await BeginHttpGetFromUrl(url);
  return contentOfUrl;
}

注意:盡管返回類型是Task<string>,返回狀態(tài)接收的是一條字符串。再一次,編譯器來管理返回狀態(tài)產(chǎn)生一個Task。

現(xiàn)在調(diào)用者能夠直接調(diào)用GetReferencedContent方法或者等待字符串變?yōu)榭傻?,或者手動讓它等待,又或者使它提前結(jié)束——無論如何它都適合使用結(jié)果。

Async-friendly APIs

如果你習(xí)慣在.NET 4或者更早之前版本上使用異步編程,你會習(xí)慣成對地使用Begin和End方法,比如WebRequest.BeginGetResponse 和WebRequest.EndGetResponse。這在.NET4.5中依然存在,但它們不使用await關(guān)鍵字。(主要是因為BeginXxx方法需要在回調(diào)中使用確切的方法調(diào)用來得到結(jié)果,而且編譯器并不依賴EndXxx命名規(guī)范).NET4.5提供了返回Task對象的新方法,所以你可以調(diào)用WebRequest.GetResponseAsync來代替WebRequest.BeginGetResponse方法。下面是一個.NET4.5中使用異步API的一個實例:

private static async Task<string> GetContent(string url)
{
   WebRequest wr = WebRequest.Create(url);
   var response = await wr.GetResponseAsync();
   using (var stm = response.GetResponseStream())
   {
     using (var reader = new StreamReader(stm))
     {
       var content = await reader.ReadToEndAsync();
       return content;
     }
   }
}

這和使用 WebRequest.GetResponse() 和 TextReader.ReadToEnd()的同步代碼是如此相似,只需要在API名后加上Async并且在方法前加上"await"關(guān)鍵字就可以了,相信你很快就能掌握它。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
精品无人乱码一区二区三区的优势| 天天免费综合色| 亚洲v国产v| 色先锋av资源中文字幕| 天天操夜夜操免费视频| 四虎影视2018在线播放alocalhost| 视频在线在亚洲| 青青青免费在线视频| freesex欧美| 欧美老熟妇乱大交xxxxx| 在线一级视频| 欧美日韩日本视频| 制服.丝袜.亚洲.中文.综合懂| 久久亚洲国产成人精品性色| 在线播放亚洲精品| 诱受h嗯啊巨肉高潮| 你懂的视频欧美| av电影在线网| 一区二区三区视频| 97电影在线看视频| 狠狠干在线视频| 干日本少妇视频| xfplay每日更新av资源在线| 视频二区欧美| 成人国产精品免费网站| 亚洲精品免费在线播放| 欧美一区二区在线观看| 最好看的中文字幕久久| 手机在线不卡av| 亚洲午夜免费| 国产一区二区激情| 99国产欧美另类久久久精品| 一区二区视频免费完整版观看| 欧美老人xxxx18| 久久精品2019中文字幕| 中文字幕在线观看不卡| 久久综合九色综合久| 日韩高清一区二区| 日韩美女视频在线| 欧美高清videos高潮hd| 99久久综合狠狠综合久久止| 日韩欧美国产精品综合嫩v| 海角国产乱辈乱精品视频| 成人中文字幕视频| 久久久久麻豆v国产| 伊人成人222| 涩涩视频在线播放| 国产精品免费大片| 国产欧美中文在线| 国产精品成人a在线观看| 久久中文字幕一区二区| 国产精品久久久久久久久久妞妞| 18在线观看的| 日本激情视频在线播放| 99久久久久久99| 又黄又骚的视频| 国产综合无码一区二区色蜜蜜| 中文字幕一区二区三区精华液| 精品人伦一区二区色婷婷| 欧美色播在线播放| 蜜臀99久久精品久久久久久软件| 高清一区二区三区av| 亚洲综合在线免费| 一级在线免费视频| 国产一级做a爱片久久毛片a| 91成人网在线观看| 欧美精品三区| 国产又粗又长又硬| 高h视频在线观看| 五丁香在线视频| 翔田千里亚洲一二三区| 国产九色91回来了| 日韩久久午夜影院| 久久人人爽人人爽人人片av高请| 日韩色在线观看| 91精品在线国产| 草民午夜欧美限制a级福利片| 进去里视频在线观看| 国产性色视频| 欧美午夜大胆人体| 国产午夜精品久久久久久久久| 天天色天天干天天色| 国产一区啦啦啦在线观看| 欧美主播一区二区三区| 久久www人成免费看片中文| 久久福利小视频| 这里只有精品国产| 国产精品av在线| 麻豆av一区二区三区久久| 久久久免费观看| 亚洲高清在线观看一区| 最近更新在线中文字幕一页| 91av资源在线| 日本高清视频www| 欧美日韩精品一区二区三区在线观看| 国产精品色哟哟| 欧美亚洲高清一区| 国产精品高潮呻吟久久av野狼| 日本三级电影网站| 日韩av中文在线观看| 亚洲免费黄色网| 久热在线视频精品网站| 欧美视频一二区| 午夜在线观看免费一区| 午夜精品一区二区三区在线| 日韩经典一区二区三区| 亚洲精品国产精品国自产在线| jizzwww| 中国女人内谢25xxxxx| 91嫩草丨国产丨精品| 这里只有精品66| 91深夜福利视频| 来吧亚洲综合网| av在线影院| 成人小视频在线播放| 人与人69性欧美三人交| 欧美电影一区二区| 亚洲精品777| 一级做a爰片久久毛片| 欧美一区二区三区在线| 男人免费av| 99视频精品免费视频| 91老师国产黑色丝袜在线| 日本aⅴ精品一区二区三区| 欧美另类视频在线观看| 午夜激情视频在线观看| 亚洲国产精品999| 人体内射精一区二区三区| 国产成人综合精品三级| 亚洲片在线观看| 久久综合给合久久狠狠色| 91精品国产高久久久久久五月天| 久久国产精品亚洲人一区二区三区| 蜜臀久久99精品久久久画质超高清| 精品国产乱码久久久久久老虎| 五月天亚洲综合小说网| 制服丝袜网站| 大伊人狠狠躁夜夜躁av一区| 欧美激情按摩在线| 精品视频在线视频| 九九精品在线观看| 黄色片网站在线播放| 国产精品国产三级国产aⅴ9色| 欧美黑人xxxⅹ高潮交| 在线观看欧美亚洲| 欧美精彩一区二区三区| 日韩大陆av| 影音成人av| 日本黄色女人| 貂蝉被到爽流白浆在线观看| 国产免费一区二区三区网站免费| 悠悠资源网久久精品| 婷婷激情图片久久| 99re视频精品| 欧美日韩精品一区二区| 成人久久久久| 国产无套粉嫩白浆在线2022年| 日本一区免费网站| 日韩欧美三级电影| 欧美午夜精品理论片a级按摩| 国产精品亚洲网站| 成人美女大片| 女女同性女同一区二区三区按摩| 国产男女激情视频| 国产美女主播视频一区| 蜜桃视频在线免费| 久久久亚洲国产| 欧美黑人性猛交xxx| 亚洲一区二区免费在线| 999av小视频在线| 日本国产高清不卡| 欧美日韩中文字幕一区| 日韩精品久久一区二区| 四虎成人免费| 粉嫩在线一区二区三区视频| 日韩av影片在线观看| 国产人久久人人人人爽| 懂色av蜜臀av粉嫩av分享吧最新章节| 一区二区在线观看视频| 国产在线制服美女| 国内外成人免费激情在线视频| 免费av片在线观看一道本| 午夜国产精品视频免费体验区| 日本女优北野望在线电影| 日韩小视频在线播放| 黄色大片免费观看| 免费高清视频在线观看| 99热在线观看| 免费污网站在线观看| 精品国产三区在线| 91久久夜色精品国产九色| 国产小视频在线观看| 99蜜桃在线观看免费视频网站| 久久久精品久久久久特色影视| av漫画在线观看| 99热在线网站| 国产一区精品在线| 欧美日韩国产bt| 国产精品免费在线免费| 91福利区在线观看| 国产成人麻豆免费观看| 国产亚洲天堂网| 乱小说欧美综合| 亚洲日产国产精品| www.成人免费视频| 天天射—综合中文网| 成人午夜高潮视频| 7788色淫网站小说| 91天天综合| 免费观看在线综合色| 特级黄国产片一级视频播放| 高清电影一区| 国产精品普通话| 亚洲人成网站在线播| 欧美裸体xxxx极品少妇| 精品调教chinesegay| 欧美极品视频在线观看| 国产精品美女久久久| 99久久婷婷国产综合| 国产成人免费视频网站| 成人av综合网| 国产亚洲精品va在线观看| 成人羞羞视频免费| 中文字幕第一区二区| 色偷偷88888欧美精品久久久| 国产精品午夜一区二区| 中文字幕中文在线| 婷婷无套内射影院| 在线播放www| 黄色成人在线| 手机看片福利盒子久久| 欧美最猛性xxxxx亚洲精品| 中文字幕第99页| 涩涩视频在线观看下载| 亚洲综合小说区| 99久精品视频在线观看视频| 国产精品久久久精品四季影院| 日韩欧美亚洲区| 亚洲专区视频| 2023国产精品自拍| 日本一区二区免费电影| 成全视频全集| 欧美成a人片免费观看久久五月天| 国产精品久久久久久免费| 中文字幕观看av| 疯狂做受xxxx高潮欧美日本| 97精品一区二区三区| 午夜在线a亚洲v天堂网2018| 亚洲二区在线播放视频| 国产极品尤物在线| 国产后进白嫩翘臀在线观看视频| 91精产国品一二三产区别沈先生| 无人区在线高清完整免费版 一区二| 天堂中文字幕一二区| 比比资源先锋| 亚洲在线不卡| 一区二区三区91| 午夜婷婷在线观看| 综合欧美精品| 欧美视频不卡中文| 国产精品115| 中文字幕一二三| 成年人视频在线网站| 天堂网在线观看视频| 999精品视频在这里| 2222www色视频在线观看| 四虎影视最新网站入口在线观看| 亚洲一区二区久久久久久久| 写真福利理论片在线播放| 久久99久久99精品中文字幕| 欧美性猛交xxx乱大交3蜜桃| 精品国产拍在线观看| 久久亚洲欧洲| 午夜av在线免费观看| 1stkiss在线漫画| 91福利免费| 国产精品美女一区二区视频| 亚洲女同性videos| 一本色道久久综合亚洲91| 日韩av手机在线观看| 最新精品视频在线| 国产成人免费av电影| 亚洲国产裸拍裸体视频在线观看乱了| 欧美国产日韩一区二区在线观看| 91精品国产综合久久小美女| 日韩欧美中文字幕一区二区| 国产亚洲欧美一区在线观看| 精品国产午夜福利在线观看| 国产精品美女久久久久av爽| 国产亚洲福利| 影音先锋国产在线资源| 这里精品视频免费| 欧美另类一区| 亚洲xxxx视频| 五月天婷婷色综合| 久久综合图片| 欧亚精品中文字幕| 国产精品拍天天在线| 四虎影院成人| 欧美性色欧美a在线播放| 亚洲综合一区二区| 台湾佬美性中文| 一区二区在线视频播放| 国产日韩中文在线中文字幕| 欧美成人精品福利在线视频| 色综合色狠狠天天综合色| 日本免费无人高清| 四虎成人免费电影| 日本精品另类| 综合久久亚洲| 亚洲mv大片欧洲mv大片| 免费成人性网站| 婷婷综合激情网| 日本电影亚洲天堂一区| 亚洲高清视频免费| 国模娜娜一区二区三区| 国产一级特黄a大片99| 国产一区二区三区日韩精品| 欧美一区二区三区免费观看| 91夜夜揉人人捏人人添红杏| 青青久久aⅴ北条麻妃| 999久久久国产999久久久| 亚洲一区在线观看免费观看电影高清| 天堂在线观看视频| 精品国产乱码久久久久久牛牛| 亚洲砖区区免费| 亚洲国产精品自拍| 欧美孕妇与黑人巨交|