async 和 await 的进阶
生活随笔
收集整理的這篇文章主要介紹了
async 和 await 的进阶
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
異常的捕獲:
static void Main(string[] args){//繼續(xù)我們的異步編程的使用嘀呀;//關(guān)于主線程是無(wú)法捕獲我們子線程中的異常滴滴啊;var t = DoExceptionAsync();t.Wait();Console.WriteLine($"{nameof(t.Status)}: {t.Status}"); //任務(wù)狀態(tài)Console.WriteLine($"{nameof(t.IsCompleted)}: {t.IsCompleted}"); //任務(wù)完成狀態(tài)標(biāo)識(shí)Console.WriteLine($"{nameof(t.IsFaulted)}: {t.IsFaulted}"); //任務(wù)是否有未處理的異常標(biāo)識(shí) Console.ReadLine();}private static async Task DoExceptionAsync(){try{await Task.Run(() => { throw new Exception(); });}catch (Exception e){Console.WriteLine($"{nameof(DoExceptionAsync)} 出現(xiàn)異常!,異常時(shí):{e.Message.ToString()}");}}}?
結(jié)果:
?
也許你有疑問(wèn):
但是:因?yàn)?#xff1a;任務(wù)沒(méi)有被取消,并且異常都已經(jīng)處理完成!
在調(diào)用方法中同步等待任務(wù)
算了,這個(gè)太簡(jiǎn)單了,有任務(wù)的等待,也有任務(wù)的取消,.......
代碼;
private static void Main(string[] args){var t = CountCharactersAsync("http://www.cnblogs.com/liqingwen/");t.Wait(); //等待任務(wù)結(jié)束Console.WriteLine($"Result is {t.Result}");Console.Read();}/// <summary>/// 統(tǒng)計(jì)字符數(shù)量/// </summary>/// <param name="address"></param>/// <returns></returns>private static async Task<int> CountCharactersAsync(string address){var result = await Task.Run(() => new WebClient().DownloadStringTaskAsync(address));return result.Length;}這里還有我們兩個(gè)靜態(tài)的方法:可采用 Task 的兩個(gè)靜態(tài)方法 WaitAll() 和 WaitAny() 。
?
private static int time = 0;static void Main(string[] args){var t1 = CountCharactersAsync("http://www.cnblogs.com/liqingwen/",1);var t2 = GetRandomAsyn(2);//Task 還以見(jiàn)數(shù)組地哦;Task<int>[] tasks = new Task<int>[] {t1,t2};Task.WaitAll(tasks);//或則:Task.WaitAny(tasks); Console.WriteLine($"t1.{nameof(t1.IsCompleted)}: {t1.IsCompleted}");Console.WriteLine($"t2.{nameof(t2.IsCompleted)}: {t2.IsCompleted}");Console.ReadLine();}/// <summary>/// 統(tǒng)計(jì)字符數(shù)量/// </summary>/// <param name="address"></param>/// <returns></returns>private static async Task<int> CountCharactersAsync(string address,int id){var result = await Task.Run(() => new WebClient().DownloadStringTaskAsync(address));Console.WriteLine($"{id} 已經(jīng)調(diào)用完成");return result.Length;}//獲取一個(gè)隨機(jī)數(shù)private static async Task<int> GetRandomAsyn(int id){var num = await Task.Run(() =>{time++;Thread.Sleep(time * 100);return new Random().Next();});Console.WriteLine($"{id} 已經(jīng)調(diào)用完成");return num;}}?
在異步方法中異步等待任務(wù)
繼續(xù)我們的異步編程之路........
class Program{private static int time = 0;static void Main(string[] args){//繼續(xù)我們的異步編程地呀;var t = GetRandomAsync();Console.WriteLine("mian line 1"); //【注意】WhenAll() 異步等待集合內(nèi)的 Task 都完成,不會(huì)占用主線程的時(shí)間。Console.WriteLine($"Result: {t.Result}"); //但是這里會(huì)堵塞id呀;Console.WriteLine("mian line 2");Console.Read();}private static async Task<int> GetRandomAsync(){time++;var t1 = Task.Run(()=>{Thread.Sleep(time* 600);return new Random().Next();});time++;var t2 = Task.Run(() =>{Thread.Sleep(time*600);return new Random().Next();});//這里開(kāi)啟了兩個(gè)異步的任務(wù);await Task.WhenAll(new List<Task<int>>() { t1, t2 }); //【注意】WhenAll() 異步等待集合內(nèi)的 Task 都完成,不會(huì)占用主線程的時(shí)間。// await Task.WhenAny(new List<Task<int>>() { t1, t2 }); Console.WriteLine($" t1.{nameof(t1.IsCompleted)}: {t1.IsCompleted} ");Console.WriteLine($" t2.{nameof(t2.IsCompleted)}:{t2.IsCompleted } ");return t1.Result + t2.Result; //這個(gè)就返回了 我們想要的基本值滴呀; }}?
結(jié)果:
?
如果該成whenAny的結(jié)果:
?
?
?
?ps:以上結(jié)果是有不確定性呀,你懂滴哦;
?
Task.Delay() 暫停執(zhí)行
?這個(gè)其實(shí)是Thread.sleep的一種取代方法地呀;
private static void Main(string[] args){Console.WriteLine($"{nameof(Main)} - start.");DoAsync();Console.WriteLine($"{nameof(Main)} - end.");Console.Read();}private static async void DoAsync(){Console.WriteLine($" {nameof(DoAsync)} - start.");await Task.Delay(500);Console.WriteLine($" {nameof(DoAsync)} - end.");}?
結(jié)果哦:
?
轉(zhuǎn)載于:https://www.cnblogs.com/mc67/p/6256705.html
總結(jié)
以上是生活随笔為你收集整理的async 和 await 的进阶的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 电脑的网卡驱动在哪(电脑的网卡驱动在哪找
- 下一篇: 飞傲x1连接电脑数据线(飞歌x1接口图解