在C#5.0中,增加了一個強大的新功能--異步編程。( .NET FrameWork4.5 版本)
它以兩個新型關鍵字出現:
1、Async方法有三種返回類型:
調用者不能等待任何返回結果,並且不能知道操作什麼時候結束或者是否成功。
當你確定你不需要知道操作何時結束或者是否成功時,你應該使用void。
return statement只需要return;,並且是可選擇。(不寫也行)
當我們不需要任何返回類值時,一個async Task方法比async void方法更好,因為他允許調用者使用await去等待,並且處理異常更容易。
return statement只需要return;,並且是可選擇的。(不寫也行)
return必須有一個T類型的表達式,比如5+x,並且必須出現在方法所有路徑的最後。
2、await try中可以使用,但不能在catch和finally中使用,我們可以通過以下方式解決
bool failed = false;try { page = await webClient.DownloadStringTaskAsync("http://oreilly.com"); } catch (WebException) { failed = true; } if (failed) { page = await webClient.DownloadStringTaskAsync("http://oreillymirror.com"); }
3、Async lambda表達式
C#是在大多數位置是不允許在Query表達式中使用await關鍵字的。是因為這些位置會被編譯成lambda表達式,正因為如此,該lambda表達式需要標記為async關鍵字。
我們可以將他們轉換,如下
IEnumerable<int> transformed = from x in alexsInts where x != 9 select x + 2;
通過使用Linq內部帶的拓展方法。然後lambda表達式變得明了可讀,繼而你也就可以標記他們為async,從而使用await了。
IEnumerable<Task<int>> tasks = alexsInts .Where(x => x != 9) .Select(async x => await DoSomthingAsync(x) + await DoSomthingElseAsync(x)); IEnumerable<int> transformed = await Task.WhenAll(tasks);
參考:中文轉載 http://www.cnblogs.com/tdws/p/5617242.html