async和await理解代码

本文详细阐述了C#中Async和Await的使用方法与原理,通过具体代码示例,解释了如何利用Async和Await进行异步编程,提高程序效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

<1>:Async和Await的理解1
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace Async和Await的立即
{
    class Program
    {
        static void Main(string[] args)
        {
            TestMain();
        }

        static void TestMain()
        {
            Console.Out.Write("Start\n");   //TestMain 方法启动

            GetValueAsync();

            Console.Out.Write("End\n");     //TestMain 方法结束
            Console.ReadKey();
        }

        /// <summary>
        /// 获取异步返回值
        /// </summary>
        /// <returns></returns>
        static async Task GetValueAsync()
        {
            Console.WriteLine("Task Start");   

            //使用async修饰的方法称之为异步方法,在异步方法中,在await关键字的修改的语句之前的代码,会通知执行.

            //await关键字修饰的语句会异步执行,await关键字并且会阻塞await关键字修饰的语句块之后的代码(在异步方法之中的代码),直到

            //await修饰的异步方法执行完毕,才会执行await修饰的语句块后面的语句(在异步方法之中的语句.)
             
            await Task.Run(() =>     
            {
                Thread.Sleep(1000);
                for (int i = 0; i < 5; ++i)
                {
                    Console.Out.WriteLine(String.Format("From task : {0}", i));
                }
            });

            Console.Out.WriteLine("Task End");
        }

        /*
         * 对上面的代码,我们可以这样理解:当主线程中有耗时任务时,我们将它写到一个异步方法中(GetValueAsync)
         * 在异步方法GetValueAsync中存在await关键字,在GetValueAsync方法中,在await关键字之前的代码,都是在主线程中同步执行的.
         * 当程序知道到异步方法中的await修饰符修饰的语句块时,开启一个线程去执行被await修饰的语句块(使其异步),并立即退出GetvalueAsync方法
         * 继续向下执行,而await修饰的语句块(一个方法,一般是开启一个线程执行耗时任务的方法)后面的代码,则等待await方法执行完成之后,之后执行
         * 我们可以理解成(异步方法拿到返回值,之后执行的语句.)
         */


    }
}
 
1
using System;
2
using System.Collections.Generic;
3
using System.Linq;
4
using System.Text;
5
using System.Threading;
6
using System.Threading.Tasks;
7

          
8
namespace Async和Await的立即
9
{
10
    class Program
11
    {
12
        static void Main(string[] args)
13
        {
14
            TestMain();
15
        }
16

          
17
        static void TestMain()
18
        {
19
            Console.Out.Write("Start\n");   //TestMain 方法启动
20

          
21
            GetValueAsync();
22

          
23
            Console.Out.Write("End\n");     //TestMain 方法结束
24
            Console.ReadKey();
25
        }
26

          
27
        /// <summary>
28
        /// 获取异步返回值
29
        /// </summary>
30
        /// <returns></returns>
31
        static async Task GetValueAsync()
32
        {
33
            Console.WriteLine("Task Start");   
34

          
35
            //使用async修饰的方法称之为异步方法,在异步方法中,在await关键字的修改的语句之前的代码,会通知执行.
36

          
37
            //await关键字修饰的语句会异步执行,await关键字并且会阻塞await关键字修饰的语句块之后的代码(在异步方法之中的代码),直到
38

          
39
            //await修饰的异步方法执行完毕,才会执行await修饰的语句块后面的语句(在异步方法之中的语句.)
40
             
41
            await Task.Run(() =>     
42
            {
43
                Thread.Sleep(1000);
44
                for (int i = 0; i < 5; ++i)
45
                {
46
                    Console.Out.WriteLine(String.Format("From task : {0}", i));
47
                }
48
            });
49

          
50
            Console.Out.WriteLine("Task End");
51
        }
52

          
53
        /*
54
         * 对上面的代码,我们可以这样理解:当主线程中有耗时任务时,我们将它写到一个异步方法中(GetValueAsync)
55
         * 在异步方法GetValueAsync中存在await关键字,在GetValueAsync方法中,在await关键字之前的代码,都是在主线程中同步执行的.
56
         * 当程序知道到异步方法中的await修饰符修饰的语句块时,开启一个线程去执行被await修饰的语句块(使其异步),并立即退出GetvalueAsync方法
57
         * 继续向下执行,而await修饰的语句块(一个方法,一般是开启一个线程执行耗时任务的方法)后面的代码,则等待await方法执行完成之后,之后执行
58
         * 我们可以理解成(异步方法拿到返回值,之后执行的语句.)
59
         */
60

          
61

          
62
    }
63
}
64

          
<2>:Async和Await的理解2
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace Async和Await的理解2
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("主线程开始运行");

            TestMain();

            Console.WriteLine("主线程结束运行");

            Console.ReadKey();
        }


        private static async void TestMain()
        {

            Console.WriteLine("等待耗时任务开始");

            //获取异步之后的返回值,异步方法执行结束之后执行的业务逻辑

            string asyncResult =await Fun();  //获取异步方法的返回值

            Console.WriteLine("耗时任务执行完成,返回结果是{0}",asyncResult);

            //进一步操作的业务逻辑
        }


        private static async Task<string> Fun()
        {
            Console.WriteLine("耗时任务开始");

            string str = "10000000";

            await Task.Run(() =>
            {

                bool b = true;

                while (b)
                {
                    if (Convert.ToInt32(str) != 0)
                    {
                        str = (Convert.ToInt32(str) - 1).ToString();
                    }
                    else
                    {
                        b = false;
                    }
                }


                Console.WriteLine("耗时任务结束");


            });

            return str;
        }

    }
}
73
 
1
using System;
2
using System.Collections.Generic;
3
using System.Linq;
4
using System.Text;
5
using System.Threading;
6
using System.Threading.Tasks;
7

          
8
namespace Async和Await的理解2
9
{
10
    class Program
11
    {
12
        static void Main(string[] args)
13
        {
14
            Console.WriteLine("主线程开始运行");
15

          
16
            TestMain();
17

          
18
            Console.WriteLine("主线程结束运行");
19

          
20
            Console.ReadKey();
21
        }
22

          
23

          
24
        private static async void TestMain()
25
        {
26

          
27
            Console.WriteLine("等待耗时任务开始");
28

          
29
            //获取异步之后的返回值,异步方法执行结束之后执行的业务逻辑
30

          
31
            string asyncResult =await Fun();  //获取异步方法的返回值
32

          
33
            Console.WriteLine("耗时任务执行完成,返回结果是{0}",asyncResult);
34

          
35
            //进一步操作的业务逻辑
36
        }
37

          
38

          
39
        private static async Task<string> Fun()
40
        {
41
            Console.WriteLine("耗时任务开始");
42

          
43
            string str = "10000000";
44

          
45
            await Task.Run(() =>
46
            {
47

          
48
                bool b = true;
49

          
50
                while (b)
51
                {
52
                    if (Convert.ToInt32(str) != 0)
53
                    {
54
                        str = (Convert.ToInt32(str) - 1).ToString();
55
                    }
56
                    else
57
                    {
58
                        b = false;
59
                    }
60
                }
61

          
62

          
63
                Console.WriteLine("耗时任务结束");
64

          
65

          
66
            });
67

          
68
            return str;
69
        }
70

          
71
    }
72
}
73

          




转载于:https://www.cnblogs.com/HelloZyjS/p/9685173.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值