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

首頁 > 編程 > C# > 正文

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

2023-05-17 11:41:54
字體:
來源:轉載
供稿:網友

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

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

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

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

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

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

相反,你不得不回調需要使用返回結果的代碼,直到它已經準備好了:

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

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

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

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

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

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

F#編譯器自動將這易于閱讀、理解的代碼轉變為可怕的回調式等價物,這樣你就可以簡單地使用異步調用的響應行為從上而下地編程。

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

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

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

關鍵字"await"表明我們希望保證自上而下的邏輯 異步調用 而不是手動編寫回調函數。下面是他們完美結合在一起的例子:

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

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

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

然后在晚點時候,文件系統完成了閱讀操作。這意味著結果現在是可獲得的,Runtime安排回調。這并不一定會立刻發生——具體的時間還依賴于同步的環境?;卣{函數運行著,捆將URL變量和文件操作的結果綁定,然后調用BeginHttpGetFromUrl。它也會立刻返回,也就是說,方法會再一次退出。

最后,HTTP操作完成,回調函數第二次運行。它將綁定Url變量的內容和顯示結果的消息框如果(如果有的話)。

我會希望向調用者返回什么值?

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:

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

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

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

現在調用者能夠直接調用GetReferencedContent方法或者等待字符串變為可得,或者手動讓它等待,又或者使它提前結束——無論如何它都適合使用結果。

Async-friendly APIs

如果你習慣在.NET 4或者更早之前版本上使用異步編程,你會習慣成對地使用Begin和End方法,比如WebRequest.BeginGetResponse 和WebRequest.EndGetResponse。這在.NET4.5中依然存在,但它們不使用await關鍵字。(主要是因為BeginXxx方法需要在回調中使用確切的方法調用來得到結果,而且編譯器并不依賴EndXxx命名規范).NET4.5提供了返回Task對象的新方法,所以你可以調用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"關鍵字就可以了,相信你很快就能掌握它。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
91免费高清视频| 精品久久久久久久久国产字幕| 国产精品一区=区| 国产在线视频一区| 91av视频在线免费观看| 国产女人精品视频| 欧美在线视频播放| 欧美电影免费观看大全| 4k岛国日韩精品**专区| 久久久精品在线| 成人免费视频xnxx.com| 性亚洲最疯狂xxxx高清| 欧美成人免费一级人片100| 欧美精品18videosex性欧美| 亚洲精品国产综合久久| 欧美成人精品h版在线观看| 亚洲乱码一区二区| 欧美国产精品日韩| 97精品国产97久久久久久春色| 热久久这里只有| 亚洲精品网址在线观看| 视频在线观看一区二区| 国产午夜精品免费一区二区三区| 亚洲夜晚福利在线观看| 色偷偷av一区二区三区乱| 欧美另类69精品久久久久9999| 亚洲欧美中文字幕| 国产精品劲爆视频| 俺去亚洲欧洲欧美日韩| 欧美一级片久久久久久久| 亚洲国产精品99| 国内精品视频在线| 日韩欧美在线视频免费观看| 97国产精品免费视频| 久久久噜噜噜久久久| 欧美日韩一区二区三区| 日韩在线一区二区三区免费视频| 成人乱色短篇合集| 国产欧美精品一区二区| 57pao国产精品一区| 久久综合亚洲社区| 久久精品成人一区二区三区| 色偷偷88888欧美精品久久久| 国产精品欧美久久久| 国产欧美韩国高清| 精品国产91久久久久久老师| 久久这里有精品视频| 成人444kkkk在线观看| 亚洲精品日韩久久久| 亚洲国产精久久久久久| 亚洲白拍色综合图区| 在线视频欧美性高潮| 久久久精品国产一区二区| 日韩高清免费在线| 97精品视频在线播放| 深夜福利日韩在线看| 日韩中文字幕精品| 日韩精品免费综合视频在线播放| 欧美另类极品videosbest最新版本| 欧美激情a在线| 国产欧美精品日韩| 亚洲激情视频网站| 久久国产精品免费视频| 自拍偷拍亚洲精品| 国产情人节一区| 岛国av一区二区在线在线观看| 国产九九精品视频| 精品国产一区二区在线| 26uuu另类亚洲欧美日本一| 欧美在线亚洲在线| 久热在线中文字幕色999舞| 国产97在线亚洲| 欧美成人精品激情在线观看| 国产精品一区二区久久| 亚洲性xxxx| 欧美又大又硬又粗bbbbb| 国产精品久久久亚洲| 欧美片一区二区三区| 国产精品久久久久免费a∨大胸| 欧美国产日韩一区二区在线观看| 8050国产精品久久久久久| 日本亚洲精品在线观看| 久操成人在线视频| 久久男人av资源网站| 国产精品偷伦免费视频观看的| 国产成人97精品免费看片| 国内揄拍国内精品| 永久免费毛片在线播放不卡| 精品露脸国产偷人在视频| 国产经典一区二区| 日韩三级成人av网| 久久久精品免费视频| 91av在线影院| 欧美国产日韩在线| 久久精品亚洲精品| 国内精久久久久久久久久人| 国产亚洲精品综合一区91| 色多多国产成人永久免费网站| 亚洲人成电影网站色xx| 久久久国产精品免费| 亚洲精品成人久久电影| 亚洲综合日韩在线| 岛国视频午夜一区免费在线观看| 青草成人免费视频| 亚洲激情小视频| 国产香蕉精品视频一区二区三区| 亚洲jizzjizz日本少妇| 中文字幕欧美日韩va免费视频| 亚洲午夜女主播在线直播| 欧美国产日韩中文字幕在线| 国产精品夫妻激情| 欧美第一页在线| 国产精品极品美女粉嫩高清在线| 7777kkkk成人观看| 清纯唯美日韩制服另类| 亚洲综合av影视| 久久全国免费视频| 国产mv免费观看入口亚洲| 国产+成+人+亚洲欧洲| 性视频1819p久久| 久久久久在线观看| 欧美老女人性视频| 亚洲淫片在线视频| 亚洲精品国产福利| 成人黄在线观看| 91老司机在线| 欧美疯狂性受xxxxx另类| 成人黄色av免费在线观看| 在线看欧美日韩| 亚洲黄色www网站| 成人写真视频福利网| 亚洲美女av电影| 国产精品男人爽免费视频1| 亚洲黄色免费三级| 国产欧美一区二区三区四区| 国语自产精品视频在免费| 日韩欧美国产免费播放| 91精品国产乱码久久久久久久久| 成人免费在线视频网站| 亚洲一区二区中文| 亚洲日本中文字幕免费在线不卡| 日本成人在线视频网址| 国产午夜精品一区二区三区| 国产精品美女主播| 亚洲国产天堂久久综合网| 日韩**中文字幕毛片| 国产成人在线一区二区| 国产亚洲精品久久| 国产97在线视频| 欧美最顶级的aⅴ艳星| 国产免费成人av| 久久久成人的性感天堂| 亚洲色图av在线| 日韩视频免费中文字幕| 综合欧美国产视频二区| 日本久久久久亚洲中字幕| 亚洲毛茸茸少妇高潮呻吟| 国产精品第2页| 91精品国产自产在线观看永久| 日韩精品极品在线观看| 国产精品视频免费在线| 精品偷拍一区二区三区在线看| 国产精品美女主播| 久久免费高清视频|