• .Net 异步方法, await async 使用


        最近朋友问起await  和 async第一次听说这个await ,就查了一下这个await使用在于 异步方法async 中,中文意思就是等待,经过一系列的百度参考简单的明白了这个东西的意思,  异步方法执行时,等待await 标识语句(存储结果或运算结果)完成,再执行异步方法中后续语句,await用来让异步方法等待一个结果的产生(http://www.cnblogs.com/liqingwen/p/5922573.html#link6) 看这段理解不太明白,别心急,看下面代码结合运行结果

    代码示例:

     1 using System;
     2 using System.Collections.Generic;
     3 using System.Linq;
     4 using System.Net.Http;
     5 using System.Text;
     6 using System.Threading;
     7 using System.Threading.Tasks;
     8 
     9 namespace 异步调用
    10 {
    11     class Program
    12     {
    13 
    14         static void Main(string[] args)
    15         {
    16 
    17             Console.WriteLine("非异步操作");
    18 
    19             var result = ansyPrint("异步操作");
    20 
    21             Console.WriteLine("非异步操作继续执行...");
    22             Console.WriteLine("非异步操作执行结束...");
    23             Console.ReadKey(true);
    24 
    25         }
    26 
    27         public static async Task<int> ansyPrint(string s)
    28         {
    29             //记得 using System.Net.Http 哦
    30             var client = new HttpClient();
    31             Console.WriteLine("异步方法开始执行:" + s);
    32             //执行异步方法 GetStringAsync
    33             Task<string> getStringTask = client.GetStringAsync("http://www.baidu.com/");
    34 
    35             //假设在这里执行一些非异步的操作
    36             Console.WriteLine("1");
    37             Console.WriteLine("2");
    38             //插在 费异步操作其中
    39             string urlContents = await getStringTask;
    40             Console.WriteLine("3");
    41 
    42             Console.WriteLine("异步方法执行结束:" + s);
    43             //返回字符串的长度(int 类型)
    44             return urlContents.Length;
    45         }
    46     }
    47 }

    运行结果:

    总结:

      通过运行结果可以看出   当执行到 await getStringTask;时 ,就跳回 主线程执行操作,挂起异步方法中 下载网页操作,但不影响主线程的操作。

      然后简单说明一下    异步方法 其中的正常运算(加减乘除或调用其他方法)不是异步操作,而是当碰到await时 之后的操作才能算是 真正的异步操作,毕竟是遇到await时才回跳到异步方法之后,由此可以看出 异步操作其实就是一个回调方法。

    /// 异步方法声明的 3 要素:
            ///     ① async 修饰符
           ///     ② 返回类型 Task 或 Task<TResult>:这里的 Task<int> 表示 return 语句返回 int 类型
            ///     ③ 方法名以 Async 结尾
            public static async Task<int> ansyPrint(string s)
            {
                //await 用在 异步方法中
                //await 等待 异步方法结果也就是Task<TResult>类型
            return result; 
         }

     联想的一些内容:

      然后看到这里的时候,我就去问我的那个朋友 (他是搞前端的)这样主线程跟异步操作之间是啥关系,我就跟他阐述一遍我上面自己得到的结论,然后我在自己的文字中发现了一个问题这个  异步操作而不是异步线程,那这两个是有啥区别呢,抱着闲来无事求证的想法,从字面来讲这两个东西确实比较相似,但追求其原理还是有一定的区别,在看了(http://www.cnblogs.com/dream844/archive/2012/06/12/2546083.html)之后有了一定的理解,我只简单说一下我的理解,详细还是看↑这个大佬的。

      异步操作:

      硬件在和内存进行数据交换的时候可以不消耗CPU资源。只要CPU在发起数据传输时发送一个指令,硬件就开 始自己和内存交换数据,在传输完成之后硬件会触发一个中断来通知操作完成。这些无须消耗CPU时间的I/O操作正是异步操作的硬件基础。我个人认为偏向于 数据存储交换

      多线程:

        线程是CPU的概念,是操作系统的一种功能,也就是 操作系统对CPU的使用方法,我个人认为 偏向于逻辑运算

      总结:

      可是总起来说这样理解很是浅,但也能指出大概想法, 不过异步并不是减少对线程的使用,可以上面的例子 想象一下 在主线程只是的时候,异步也在进行操作,其实也就是开了一条子线程,当异步操作完毕,又回到主线程,只是占用的时间相对来说减少一些。 我大概设想,但真正是不是异步操作执行完毕又回到主线程几率不大(其实是系统随机,便于理解),不过最后只是占用了一条线程而不是多条。

  • 相关阅读:
    dnsServer SmartDNS / smartdns / DNS UDP 53
    springBoot 自定义注解 + 自定义异常捕获实战
    查询出ES库所有数据
    springBoot2.X 支持http、https访问
    配置ES IK分词器自定义字典
    搭建angular开发环境 运行 ng-alain框架
    【jQuery】 选择器
    【jQuery】 js 对象
    【C#】 URL Protocol
    【C#】 反射
  • 原文地址:https://www.cnblogs.com/nnqwbc/p/7404784.html
Copyright © 2020-2023  润新知