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

代码示例:

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
using System.Text;
using System.Threading;
using System.Threading.Tasks; namespace 异步调用
{
class Program
{ static void Main(string[] args)
{ Console.WriteLine("非异步操作"); var result = ansyPrint("异步操作"); Console.WriteLine("非异步操作继续执行...");
Console.WriteLine("非异步操作执行结束...");
Console.ReadKey(true); } public static async Task<int> ansyPrint(string s)
{
//记得 using System.Net.Http 哦
var client = new HttpClient();
Console.WriteLine("异步方法开始执行:" + s);
//执行异步方法 GetStringAsync
Task<string> getStringTask = client.GetStringAsync("http://www.baidu.com/"); //假设在这里执行一些非异步的操作
Console.WriteLine("");
Console.WriteLine("");
//插在 费异步操作其中
string urlContents = await getStringTask;
Console.WriteLine(""); Console.WriteLine("异步方法执行结束:" + s);
//返回字符串的长度(int 类型)
return urlContents.Length;
}
}
}

运行结果:

总结:

  通过运行结果可以看出   当执行到 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的使用方法,我个人认为 偏向于逻辑运算

  总结:

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

.Net 异步方法, await async 使用的更多相关文章

  1. 如何避免 await/async 地狱

    原文地址:How to escape async/await hell 译文出自:夜色镇歌的个人博客 async/await 把我们从回调地狱中解救了出来,但是如果滥用就会掉进 async/await ...

  2. 【.NET异步编程系列1】:await&async语法糖让异步编程如鱼得水

    前导 Asynchronous programming Model(APM)异步编程模型以BeginMethod(...) 和 EndMethod(...)结对出现. IAsyncResult Beg ...

  3. .net core 入坑经验 - 1、await async

    已经有些日子没学习新知识了,心血来潮想试试core有多大变化和跨平台运行 所以现在就开始捣鼓,然而由于是从.net 4.0直接"跃升"到.net core 以及 asp.net m ...

  4. 【异步编程】Part1:await&async语法糖让异步编程如鱼得水

    前导 Asynchronous programming Model(APM)异步编程模型以BeginMethod(...) 和 EndMethod(...)结对出现. IAsyncResult Beg ...

  5. C#中await/async闲说

    自从C#5.0增加异步编程之后,异步编程越来越简单,async和await用的地方越来越多,越来越好用,只要用异步的地方都是一连串的异步,如果想要异步编程的时候,需要从底层开始编写,这样后边使用的时候 ...

  6. await/async闲说

    C#中await/async闲说 自从C#5.0增加异步编程之后,异步编程越来越简单,async和await用的地方越来越多,越来越好用,只要用异步的地方都是一连串的异步,如果想要异步编程的时候,需要 ...

  7. javascript异步编程的前世今生,从onclick到await/async

    javascript与异步编程 为了避免资源管理等复杂性的问题, javascript被设计为单线程的语言,即使有了html5 worker,也不能直接访问dom. javascript 设计之初是为 ...

  8. Silverlight项目笔记1:UI控件与布局、MVVM、数据绑定、await/async、Linq查询、WCF RIA Services、序列化、委托与事件

    最近从技术支持转到开发岗,做Silverlight部分的开发,用的Prism+MVVM,框架由同事搭好,目前做的主要是功能实现,用到了一些东西,侧重于如何使用,总结如下 1.UI控件与布局 常用的主要 ...

  9. 5分种让你了解javascript异步编程的前世今生,从onclick到await/async

      javascript与异步编程 为了避免资源管理等复杂性的问题,javascript被设计为单线程的语言,即使有了html5 worker,也不能直接访问dom. javascript 设计之初是 ...

  10. es7 await/async解决异步问题

    最近做项目遇到一个问题,前端调用ie浏览器中的ocx的方法去查询数据,查询完之后ocx给一个返回值,然后js将返回值当参数传入到另外的函数中去做数据处理,但是遇到一个问题是前端需要异步去执行这个过程 ...

随机推荐

  1. [转载] HBase vs Cassandra:我们迁移系统的原因

    转载自http://www.csdn.net/article/2010-11-29/282698 我的团队近来正在忙于一个全新的产品——即将发布的网络游戏www.FightMyMonster.com. ...

  2. [转载] java多线程学习-java.util.concurrent详解(二)Semaphore/FutureTask/Exchanger

    转载自http://janeky.iteye.com/blog/770393 ------------------------------------------------------------- ...

  3. 照虎画猫写自己的Spring

    从细节跳出来 看了部分Spring的代码,前面用了四篇内容写了一些读书笔记. 回想起来,论复杂度,Spring够喝上好几壶的.他就像一颗枝繁叶茂的大树,远处看,只是一片绿:走近看,他为你撑起一片小天地 ...

  4. java 之 简单工厂模式(大话设计模式)

    以前只是看设计模式,每次看完都去理解一次,并没有手动去写代码,所以理解的还不是很深刻,最近查看框架源码,发现很多地方用到的都是设计模式,因为对设计模式理解的不够深刻,所以源码查看进度很慢!现在决定来温 ...

  5. 《java.util.concurrent 包源码阅读》02 关于java.util.concurrent.atomic包

    Aomic数据类型有四种类型:AomicBoolean, AomicInteger, AomicLong, 和AomicReferrence(针对Object的)以及它们的数组类型, 还有一个特殊的A ...

  6. 通用Adapter设计,SparseArray+泛型+回调的使用

    看到题目,我相信聪明的各位已经有一定想法了. 一个Adapter,最简单的优化就是使用泛型,他可以省去非常多的代码,不过在此之上,我们还可以继续优化,优化他的好基友是:ViewHolder. 在过去, ...

  7. web离线应用--dom storage

    web离线应用--dom storage dom storage是html5添加的新功能,其实也不是什么新的应用,只不过是cookie的放大版本,由于cookie的大小只有4kb,而且在每次请求一个新 ...

  8. CCF认证之——相反数

    这道题目非常简单! #include<iostream> using namespace std; int main() { ],n,count=; cin >> n; ; i ...

  9. android动画基础之Animation

    android 动画 摘要: 概述 最近总结一下Android的一些东西,毕竟基础不牢地动山摇.本篇主要涉及Animation,对Tween和Frame动画做些总结. Tween Tween动画即补间 ...

  10. ES6这些就够了

    刚开始用vue或者react,很多时候我们都会把ES6这个大兄弟加入我们的技术栈中.但是ES6那么多那么多特性,我们需要全部都掌握吗?秉着二八原则,掌握好常用的,有用的这个可以让我们快速起飞. 接下来 ...