Async和Await异步函数的示例分享

Async异步是C#5.0时代引入的
本文主要分享,有返回值和无返回值的async异步函数的编写方式,以及await的使用。

1. 同步调用

这里模拟了两个耗时任务AsyncMethod1和AsyncMethod2,每个任务耗时5秒钟。

  		public static void AsyncMethod1()
        {
     
            Thread.Sleep(5000);
            Console.WriteLine("This is method 1" + "\t" + Thread.CurrentThread.ManagedThreadId + "\t" + DateTime.Now.Second);
        }
        public static void AsyncMethod2()
        {
     
            Thread.Sleep(5000);
            Console.WriteLine("This is method 2" + "\t" + Thread.CurrentThread.ManagedThreadId + "\t" + DateTime.Now.Second);
        }

调用

 		public static void Main(string[] args)
        {
     
        	AsyncMethod1();
            AsyncMethod2();
            Console.ReadKey();
        }

结果:在同步模式下,两个任务运行于同一个线程,前后相隔5秒钟时间,这个没什么好说的。
Async和Await异步函数的示例分享_第1张图片
但是现在有一个需求,就是需要两个任务同时执行,将原本加起来需要执行10秒钟的时间缩减至5秒钟,这时候就需要使用异步的方式。

2. 使用async异步调用

我们只需要将同步方法稍加修改,则会变成一个异步方法

 		public async static void AsyncMethod1()
        {
     
            await Task.Run(() =>
            {
     
                //Task.Delay(5000); 这里为什么不用此延时? 原因就是Task.Delay()本身就是一个异步延时,执行后看不到延时效果
                Thread.Sleep(5000);
                Console.WriteLine("This is method 1" + "\t" + Thread.CurrentThread.ManagedThreadId + "\t" + DateTime.Now.Second);
            });
        }
        public async static void AsyncMethod2()
        {
     
            await Task.Run(() =>
            {
     
                Thread.Sleep(5000);
                Console.WriteLine("This is method 2" + "\t" + Thread.CurrentThread.ManagedThreadId + "\t" + DateTime.Now.Second);
            });
        }

调用

		public static void Main(string[] args)
        {
     
        	AsyncMethod1();
            AsyncMethod2();
            Console.ReadKey();
        }

结果:在异步模式下两个方法被同时调用,而且分别位于不同的线程之上
Async和Await异步函数的示例分享_第2张图片

3.使用await阻塞某一任务

如果有3个方法需要被异步执行,但是其他的两个方法要等待方法一执行结束后,才能执行,这种场景下需要使用await阻塞当前某一方法,这个方法必须是返回Task类型或者Task<泛型>类型的

  		public async static void Run()
        {
     
        	//阻塞当前任务,使其执行完毕才能往下继续执行
            await AsyncMethod3(); 
            
            AsyncMethod1();
            AsyncMethod2();
        }
		public async static void AsyncMethod1()
        {
     
            await Task.Run(() =>
            {
     
                Thread.Sleep(5000);
                Console.WriteLine("This is method 1" + "\t" + Thread.CurrentThread.ManagedThreadId + "\t" + DateTime.Now.Second);
            });
        }
        public async static void AsyncMethod2()
        {
     
            await Task.Run(() =>
            {
     
                Thread.Sleep(5000);
                Console.WriteLine("This is method 2" + "\t" + Thread.CurrentThread.ManagedThreadId + "\t" + DateTime.Now.Second);
            });
        }
        public async static Task AsyncMethod3()
        {
     
            await Task.Run(() =>
            {
     
                Thread.Sleep(5000);
                Console.WriteLine("This is method 3" + "\t" + Thread.CurrentThread.ManagedThreadId + "\t" + DateTime.Now.Second);
            });
        }

调用

 		public static void Main(string[] args)
        {
     
            Run();
            Console.ReadKey();
        }

结果
Async和Await异步函数的示例分享_第3张图片

4. 带返回值带参数的异步方法

如果此方法是带返回值的,返回类型为:Task<返回值类型>

		public async static void Run()
        {
     
            string str = await AsyncMethod4(3, 4);
            Console.WriteLine(str);
        }
  		public async static Task<string> AsyncMethod4(int x1, int y1)
        {
     
            string str = "";
            await Task.Run(() =>
            {
     
                str = (x1 + y1).ToString() + "\t" + "\t" + "\t" + Thread.CurrentThread.ManagedThreadId + "\t" + DateTime.Now.Second;
            });
            return str;
        }

调用

  		public static void Main(string[] args)
        {
     
            Run();
            Console.ReadKey();
        }

结果
Async和Await异步函数的示例分享_第4张图片
以上,如果有错误,欢迎及时批评指正,感谢。。。

你可能感兴趣的:(C#)