<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

async和await理解代码的更多相关文章

  1. C# async 和 await 理解

    C# async 和 await 理解 先假设如下场景: 主函数 Main,循环等待用户输入: 计算函数 Cal,耗时计算大量数据: class Test { static int Main(stri ...

  2. C# 中的Async 和 Await 的用法详解

    众所周知C#提供Async和Await关键字来实现异步编程.在本文中,我们将共同探讨并介绍什么是Async 和 Await,以及如何在C#中使用Async 和 Await. 同样本文的内容也大多是翻译 ...

  3. await和async更多的理解

    最近有不少网友提起await和async,呵呵,C# 5引进的语法糖. 这个语法糖还真不好吃,能绕倒一堆初学的朋友,在网上也有很多网友关于这块知识点的争论,有对有错,今天在这里把这个误区好好讲讲. 在 ...

  4. ES7前端异步玩法:async/await理解

    在最新的ES7(ES2017)中提出的前端异步特性:async.await. 什么是async.await? async顾名思义是"异步"的意思,async用于声明一个函数是异步的 ...

  5. 第十五节:深入理解async和await的作用及各种适用场景和用法

    一. 同步VS异步 1.   同步 VS 异步 VS 多线程 同步方法:调用时需要等待返回结果,才可以继续往下执行业务 异步方法:调用时无须等待返回结果,可以继续往下执行业务 开启新线程:在主线程之外 ...

  6. .net 中的async,await理解

    理解: 1.async修饰的方法可理解为异步方法(必须要配合await,否则和普通方法无异)2.当async方法执行遇到await,则立即将控制权转移到async方法的调用者3.由调用者决定是否需要等 ...

  7. Ext JS学习第十六天 事件机制event(一) DotNet进阶系列(持续更新) 第一节:.Net版基于WebSocket的聊天室样例 第十五节:深入理解async和await的作用及各种适用场景和用法 第十五节:深入理解async和await的作用及各种适用场景和用法 前端自动化准备和详细配置(NVM、NPM/CNPM、NodeJs、NRM、WebPack、Gulp/Grunt、G

    code&monkey   Ext JS学习第十六天 事件机制event(一) 此文用来记录学习笔记: 休息了好几天,从今天开始继续保持更新,鞭策自己学习 今天我们来说一说什么是事件,对于事件 ...

  8. ES7前端异步玩法:async/await理解 js原生API妙用(一)

    ES7前端异步玩法:async/await理解   在最新的ES7(ES2017)中提出的前端异步特性:async.await. 什么是async.await? async顾名思义是“异步”的意思,a ...

  9. C# 多线程(18):一篇文章就理解async和await

    目录 前言 async await 从以往知识推导 创建异步任务 创建异步任务并返回Task 异步改同步 说说 await Task 说说 async Task 同步异步? Task封装异步任务 关于 ...

随机推荐

  1. c语言博客作业01—分支、顺序结构

    1.本章学习总结  1.1 思维导图  1.2本章学习体会及代码量学习体会  1.2.1学习体会 这周 对c语言的学习 明显与其他同学相比较有些滞后,觉得很大原因是暑假没有看教学视频,课前没有预习课本 ...

  2. java -io字符流FileWrite操作演示

    FileWriter字符输出流演示: /* * FiileWriter 字符流的操作 * FileWriter 的构造方法 可传递 File类型 还可以传递String类型 * * 方法 : * wr ...

  3. php-fpm 和 nginx 的两种通信方式

    在 linux 中,nginx 服务器和 php-fpm 可以通过 tcp socket 和 unix socket 两种方式实现. 一下内容转自:https://blog.csdn.net/qq62 ...

  4. [Objective-C语言教程]多态(26)

    多态性这个词表示有许多形式. 通常,当存在类的层次结构并且通过继承相关时,会发生多态性. Objective-C多态表示对成员函数的调用将导致执行不同的函数,具体取决于调用该函数的对象的类型. 考虑下 ...

  5. linux下安装nginx,centos安装nginx

    初学nginx,进行简单的安装和配置. 一.依赖 openssl-fips-2.0.9.tar.gz zlib-1.2.11.tar.gz pcre-8.01.tar.gz nginx-1.8.0.t ...

  6. Java初学者的学习路线建议

    java学习这一部分其实也算是今天的重点,这一部分用来回答很多群里的朋友所问过的问题,那就是我你是如何学习Java的,能不能给点建议?今天我是打算来点干货,因此咱们就不说一些学习方法和技巧了,直接来谈 ...

  7. 符合Python风格的对象

    array和bytes的转换 - 每个array必须有一个type_code,以此为依据解析底层字节序列 - array有一个frombytes方法,可以把字节序列按type_code转换成Array ...

  8. Solr学习笔记(5)—— Spring Data Solr入门

    一.Spring Data Solr简介 前面已经介绍了通过solrJ来操作solr,那么我们如何将Solr的应用集成到Spring中?Spring Data Solr就是为了方便Solr的开发所研制 ...

  9. 【VS2015】关于VS2015如何运行的问题

    各位看官,lt's been a long time since we met last time. 是否习惯了CodeBlocks那种简易编写C文件?一到写工程就懵逼的状态?今天我给他们带来如何让C ...

  10. C# 聊一聊屏保的设置

    初步认识屏保 进入屏保设置 强行开头,大家都知道我们只需要在搜索框打入“屏保”,就能进入屏保的设置选项.然而箭头指向的位置到底是在Windows的哪个地方呢?这就是写这篇博客的原因. 进入一个屏幕保护 ...