使用Async和Await的异步编程

遇到await后,后序代码由新线程接管,即操作开始异步。
官方文档

简易版

不阻塞主线程

class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine($"主线程{Thread.CurrentThread.ManagedThreadId}");
            Console.WriteLine($"主线程{Thread.CurrentThread.ManagedThreadId}:{SayAsync().Status}");
            Console.WriteLine($"主线程{Thread.CurrentThread.ManagedThreadId}");
            Console.ReadKey(true);
        }

        public static async Task<string> SayAsync()
        {
            Console.WriteLine($"主线程{Thread.CurrentThread.ManagedThreadId}_SayAsync");

            var s = await Task<string>.Run(async () =>
            {
                await Task.Delay(TimeSpan.FromSeconds(2));
                Console.WriteLine("---------------两秒后----------------");
                Console.WriteLine($"子线程{Thread.CurrentThread.ManagedThreadId}");
                return "vvull";
            });
            Console.WriteLine($"子线程{Thread.CurrentThread.ManagedThreadId}:{s}");
            Console.WriteLine($"子线程{Thread.CurrentThread.ManagedThreadId}");
            return s;
        }

    }

阻塞主线程

class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine($"主线程{Thread.CurrentThread.ManagedThreadId}");
            Console.WriteLine($"主线程{Thread.CurrentThread.ManagedThreadId}:{SayAsync().Result}");//阻塞主线程
            Console.WriteLine($"主线程{Thread.CurrentThread.ManagedThreadId}");
            Console.ReadKey(true);
        }

        public static async Task<string> SayAsync()
        {
            Console.WriteLine($"主线程{Thread.CurrentThread.ManagedThreadId}_SayAsync");

            var s = await Task<string>.Run(async () =>
            {
                await Task.Delay(TimeSpan.FromSeconds(2));
                Console.WriteLine("---------------两秒后----------------");
                Console.WriteLine($"子线程{Thread.CurrentThread.ManagedThreadId}");
                return "vvull";
            });
            Console.WriteLine($"子线程{Thread.CurrentThread.ManagedThreadId}:{s}");
            Console.WriteLine($"子线程{Thread.CurrentThread.ManagedThreadId}");
            return s;
        }

    }

进阶版

class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine($"{Thread.CurrentThread.ManagedThreadId}->主线程");
            giaoAsync();
            Thread.Sleep(3000);
            Console.WriteLine("---------------三秒后----------------");
            Console.WriteLine($"{Thread.CurrentThread.ManagedThreadId}->主线程");
            Console.ReadKey();
        }
        static async Task giaoAsync()
        {
            Console.WriteLine($"{Thread.CurrentThread.ManagedThreadId}->giao");

            //Console.WriteLine($"{Thread.CurrentThread.ManagedThreadId}->giao:{await SayAsync()}");//本句以后由新线程接管
            //Console.WriteLine($"{Thread.CurrentThread.ManagedThreadId}->giao*");

            var s = await SayAsync();//由新线程接管
            Console.WriteLine($"{Thread.CurrentThread.ManagedThreadId}->giao**_{s}");
            Console.WriteLine($"{Thread.CurrentThread.ManagedThreadId}->giao**");

            var ss = await SayAsync();//由新线程接管
            Console.WriteLine($"{Thread.CurrentThread.ManagedThreadId}->giao***_{ss}");
            Console.WriteLine($"{Thread.CurrentThread.ManagedThreadId}->giao***");
        }

        public static async Task<string> SayAsync()
        {
            Console.WriteLine($"{Thread.CurrentThread.ManagedThreadId}->SayAsync");

            var s = await Task<string>.Run(async () =>
            {                
                Console.WriteLine($"{Thread.CurrentThread.ManagedThreadId}->SayAsync*");
                await Task.Delay(TimeSpan.FromSeconds(2));
                Console.WriteLine("---------------两秒后----------------");
                Console.WriteLine($"{Thread.CurrentThread.ManagedThreadId}->SayAsync**");
                return "vvull";
            });
            Console.WriteLine($"{Thread.CurrentThread.ManagedThreadId}->SayAsync**_{s}");
            Console.WriteLine($"{Thread.CurrentThread.ManagedThreadId}->SayAsync**");
            return s;
        }

    }

官方例子魔改

using System;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;

namespace AsyncBreakfast
{
    class Program
    {
        static async Task Main(string[] args)
        {
            Coffee cup = PourCoffee();
            Console.WriteLine("coffee is ready");
            Console.WriteLine($"{Thread.CurrentThread.ManagedThreadId}->线程*");
            var eggsTask = FryEggsAsync(2);
            var baconTask = FryBaconAsync(3);
            var toastTask = MakeToastWithButterAndJamAsync(2);
            Console.WriteLine($"{Thread.CurrentThread.ManagedThreadId}->线程*");
            var breakfastTasks = new List<Task> { eggsTask, baconTask, toastTask };
            while (breakfastTasks.Count > 0)
            {
                Task finishedTask = await Task.WhenAny(breakfastTasks);
                Console.WriteLine($"{Thread.CurrentThread.ManagedThreadId}->线程**");
                if (finishedTask == eggsTask)
                {
                    Console.WriteLine("eggs are ready");
                }
                else if (finishedTask == baconTask)
                {
                    Console.WriteLine("bacon is ready");
                }
                else if (finishedTask == toastTask)
                {
                    Console.WriteLine("toast is ready");
                }
                breakfastTasks.Remove(finishedTask);
                Console.WriteLine($"{Thread.CurrentThread.ManagedThreadId}->线程**");
            }
            Juice oj = PourOJ();
            Console.WriteLine("oj is ready");
            Console.WriteLine("Breakfast is ready!");
            Console.WriteLine($"{Thread.CurrentThread.ManagedThreadId}->线程***");
            Console.ReadKey();
        }

        static async Task<Toast> MakeToastWithButterAndJamAsync(int number)
        {
            Console.WriteLine($"{Thread.CurrentThread.ManagedThreadId}->线程*");
            var toast = await ToastBreadAsync(number);
            Console.WriteLine($"{Thread.CurrentThread.ManagedThreadId}->Toast线程");
            ApplyButter(toast);
            ApplyJam(toast);

            return toast;
        }

        private static Juice PourOJ()
        {
            Console.WriteLine("Pouring orange juice");
            return new Juice();
        }

        private static void ApplyJam(Toast toast) =>
            Console.WriteLine($"{Thread.CurrentThread.ManagedThreadId}->Toast线程   " + "Putting jam on the toast");

        private static void ApplyButter(Toast toast) =>
            Console.WriteLine($"{Thread.CurrentThread.ManagedThreadId}->Toast线程   " + "Putting butter on the toast");

        private static async Task<Toast> ToastBreadAsync(int slices)
        {
            Console.WriteLine($"{Thread.CurrentThread.ManagedThreadId}->线程*");
            for (int slice = 0; slice < slices; slice++)
            {
                Console.WriteLine("Putting a slice of bread in the toaster");
            }
            Console.WriteLine("Start toasting...");
            await Task.Delay(3000);
            Console.WriteLine("--------Toast三秒后--------");
            Console.WriteLine($"{Thread.CurrentThread.ManagedThreadId}->Toast线程");
            Console.WriteLine("Remove toast from toaster");

            return new Toast();
        }

        private static async Task<Bacon> FryBaconAsync(int slices)
        {
            Console.WriteLine($"{Thread.CurrentThread.ManagedThreadId}->线程*");
            Console.WriteLine($"putting {slices} slices of bacon in the pan");
            Console.WriteLine("cooking first side of bacon...");
            await Task.Delay(3000);
            Console.WriteLine("--------Bacon三秒后--------");
            for (int slice = 0; slice < slices; slice++)
            {
                Console.WriteLine("flipping a slice of bacon");
            }
            Console.WriteLine("cooking the second side of bacon...");
            Console.WriteLine($"{Thread.CurrentThread.ManagedThreadId}->Bacon线程*");
            await Task.Delay(3000);
            Console.WriteLine("--------Bacon第二次三秒后--------");
            Console.WriteLine($"{Thread.CurrentThread.ManagedThreadId}->Bacon线程**");
            Console.WriteLine("Put bacon on plate");

            return new Bacon();
        }

        private static async Task<Egg> FryEggsAsync(int howMany)
        {
            Console.WriteLine($"{Thread.CurrentThread.ManagedThreadId}->线程*");
            Console.WriteLine("Warming the egg pan...");
            await Task.Delay(3000);
            Console.WriteLine("--------Eggs三秒后--------");
            Console.WriteLine($"{Thread.CurrentThread.ManagedThreadId}->Eggs线程*");
            Console.WriteLine($"cracking {howMany} eggs");
            Console.WriteLine("cooking the eggs ...");
            await Task.Delay(3000);
            Console.WriteLine("--------Eggs第二次三秒后--------");
            Console.WriteLine($"{Thread.CurrentThread.ManagedThreadId}->Eggs线程**");
            Console.WriteLine("Put eggs on plate");

            return new Egg();
        }

        private static Coffee PourCoffee()
        {
            Console.WriteLine("Pouring coffee");
            return new Coffee();
        }
    }

    class Egg
    {

    }

    class Toast
    {

    }

    class Juice
    {

    }

    class Bacon
    {

    }

    class Coffee
    {

    }
}
posted @ 2020-07-01 11:44  vvull  阅读(248)  评论(0编辑  收藏  举报