<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学习笔记XML(3)

    XML简介 XML即可扩展的标记语言.因此该语言中所有的标签都是没有预先定义的,开发者可以自己随意的指定. 目前为止所有的标记的语言都属于开源的语言.由W3C组织进行一个基本的维护. 因此大家学习这些 ...

  2. 【Oracle 12c】最新CUUG OCP-071考试题库(57题)

    57.(14-17) choose two: Examine the structure of the DEPARTMENTS table You execute the following comm ...

  3. SpringMvc date数据传递处理

    1.form表单提交date数据 form表单提交的date数据要在接收的字段上加入@DateTimeFormat注解 @DateTimeFormat(pattern = "yyyy-MM- ...

  4. Vmware下Kali设置桥接网络无法上网

    1.检查是否设置桥接 2.编辑>首选项>虚拟网络编辑器>选对本机上网的网卡 3.检查上网的网卡>适配器属性栏有没有 Vmware Bridge Protocol 桥接的服务. ...

  5. 【Qt开发】实现系统托盘,托盘菜单,托盘消息

    概述 系统托盘就是在系统桌面底部特定的区域显示运行的程序.windows在任务栏状态区域,linux在布告栏区域.应用程序系统托盘功能,是比较普遍的功能,本篇将详细的介绍如何实现该功能. 演示Demo ...

  6. 校验 CentOS 7 镜像文件

    验证镜像文件的原因 CentOS Vault(http://vault.centos.org/)页脚的镜像站链接上有段英文,指出页脚的镜像站链接不受 CentOS 团队的监控,除此之外还有一个原因就是 ...

  7. 常用DOS命令和Linux命令

    DOS命令 1.查询端口占用情况:netstat -aon |findstr "8080"; 查看端口进程号: 2.查看进程号信息:   tasklist |findstr &qu ...

  8. php 下载文件/直接下载数据内容

    思路步骤 * 定义参数 * 魔术方法 * 执行下载 * 获取设置属性函数 * 获取设置文件mime 类型 * 获取设置下载文件名 * 设置header * 下载函数 实现代码 class DownFi ...

  9. Sweep Line

    391. Number of Airplanes in the Sky https://www.lintcode.com/problem/number-of-airplanes-in-the-sky/ ...

  10. 开源项目-Aiguille

        项目地址: https://github.com/wwkai555/Aiguille 这个项目主要使用Android L新特性 - 最新的widget以及一些值得推荐和使用的开源库比如butt ...