.Net 异步方法, await async 使用

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

代码示例:

 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操做正是异步操做的硬件基础。我我的认为偏向于 数据存储交换async

  多线程:

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

  总结:

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

相关文章
相关标签/搜索