async 和 await 的進階

異常的捕獲:編程

static void Main(string[] args)
        {
            //繼續咱們的異步編程的使用嘀呀;
            //關於主線程是沒法捕獲咱們子線程中的異常滴滴啊;

            var t = DoExceptionAsync();
            t.Wait();
            Console.WriteLine($"{nameof(t.Status)}: {t.Status}");   //任務狀態
            Console.WriteLine($"{nameof(t.IsCompleted)}: {t.IsCompleted}");     //任務完成狀態標識
            Console.WriteLine($"{nameof(t.IsFaulted)}: {t.IsFaulted}");     //任務是否有未處理的異常標識

            Console.ReadLine();
        }
        private static async Task DoExceptionAsync()
        {
            try
            {

                await Task.Run(() => { throw new Exception(); });
            }
            catch (Exception e)
            {
                Console.WriteLine($"{nameof(DoExceptionAsync)} 出現異常!,異常時:{e.Message.ToString()}");
            }
        }
    }

 

結果:數組

 

也許你有疑問:dom

可是:由於:任務沒有被取消,而且異常都已經處理完成!異步

在調用方法中同步等待任務

算了,這個太簡單了,有任務的等待,也有任務的取消,.......async

代碼;異步編程

 private static void Main(string[] args)
        {
            var t = CountCharactersAsync("http://www.cnblogs.com/liqingwen/");

            t.Wait();   //等待任務結束
            Console.WriteLine($"Result is {t.Result}");

            Console.Read();
        }

        /// <summary>
        /// 統計字符數量
        /// </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;
        }

這裏還有咱們兩個靜態的方法:可採用 Task 的兩個靜態方法 WaitAll() 和 WaitAny() 。spa

 

  private static int time = 0;
        static void Main(string[] args)
        {


            var t1 = CountCharactersAsync("http://www.cnblogs.com/liqingwen/",1);
            var t2 = GetRandomAsyn(2);

            //Task 還以見數組地哦;
            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>
        /// 統計字符數量
        /// </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} 已經調用完成");
            return result.Length;
        }
        //獲取一個隨機數

        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} 已經調用完成");
            return num;
        }

    }

 

在異步方法中異步等待任務線程

繼續咱們的異步編程之路........code

class Program
    {
        private static int time = 0;
        static void Main(string[] args)
        {
            //繼續咱們的異步編程地呀;
            var t = GetRandomAsync();
            Console.WriteLine("mian line 1");  //【注意】WhenAll() 異步等待集合內的 Task 都完成,不會佔用主線程的時間。
            Console.WriteLine($"Result: {t.Result}"); //可是這裏會堵塞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();
             });

            //這裏開啓了兩個異步的任務;
            await Task.WhenAll(new List<Task<int>>() { t1, t2 }); //【注意】WhenAll() 異步等待集合內的 Task 都完成,不會佔用主線程的時間。

            // 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; //這個就返回了 咱們想要的基本值滴呀;

        }
    }

 

結果:blog

 

若是該成whenAny的結果:

 

 

 

 ps:以上結果是有不肯定性呀,你懂滴哦;

 

Task.Delay() 暫停執行

 這個實際上是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.");
        }

 

結果哦:

相關文章
相關標籤/搜索