<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. java学习笔记—c3p0连接池与元数据分析(42)

    第一步:导入c3p0包 第二步:在classpath目录下,创建一个c3p0-config.xml <?xml version="1.0" encoding="UT ...

  2. 使用X-Pack插件来进行权限控制

    1.为elasticsearch安装X-Pack插件.进入 elasticsearch根目录,执行: bin/elasticsearch-plugin install x-pack杀掉进程,重启es, ...

  3. Struts2的优点与Struts1的区别:

    单实例与多实例有状态就是有数据存储功能,比如购物车,买一件东西放进去,可以再次购买或者删减.无状态就是一次操作,不能保存数据. 有状态对象,就是有成员属性的对象,可以保存数据,是非线程安全的.无状态对 ...

  4. $.ajax()——超时设置,增加 loading 提升体验

    前端发送Ajax请求到服务器,服务器返回数据这一过程,因原因不同耗时长短也有差别,且这段时间内页面显示空白.如何优化这段时间内的交互体验,以及长时间内服务器仍未返回数据这一问题,是我们开发中不容忽视的 ...

  5. Windows 断开CIFS共享出现 “此网络连接不存在”

    Windows 断开CIFS共享出现 "此网络连接不存在" 首先请您尝试 net use * /delete /y 命令,若无效本文就是为您准备的. 检查是否是因为用户被设置共享桌 ...

  6. python 爬虫 黑科技

    1.最基本的抓站 import urllib2 content = urllib2.urlopen('http://XXXX').read() 2.使用代理服务器 这在某些情况下比较有用,比如IP被封 ...

  7. 函数直接写在html页面的<script>里可以调用,但是单独放在js文件里不能调用

    1.函数直接写在页面相当于是你本页调用,所以理所应当可以调用 2.js单独文件不能调用是因为你没有引用js文件,如果引用了的话,也是可以调用的. 引用方式,你可以直接拖拽(我一般都是拖拽,因为路径准确 ...

  8. mysql误删root用户

    在操作mysql时误删除root用户,如何进行恢复 在安装hive时候误删除root用户,存在的用户没有权限,解决方法如下. 1.首先在/etc/my.cnf文件中 mysqlID下面添加 skip- ...

  9. poj3207 Ikki's Story IV - Panda's Trick 2-SAT

    题目传送门 题意:在一个圆上顺时针安放着n个点,给出m条线段连接端点,要求线段不相交,线段可以在圆内也可以在圆外,问是否可以. 思路:假设一条线段,放在圆外是A,放在园内是A',那么两条线段如果必须一 ...

  10. HDU - 4630 离线处理区间点对问题

    题意:给定\(a[1...n]\),多次询问\([L,R]\)中的任意一对数使得\(gcd(a_i,a_j)\)最大 对于gcd,区间内至少存在两个相同的因子才能作为合法的解,存在两个相同因子且最大就 ...