线程的同步运行,时效性慢,异步运行,时效性快!

在c#5.0引出了async/await关键字,可以用其来进行异步编程。

async/await定义异步方法的语法如下:

1、在方法的返回类型前面加上async关键字;

2、返回类型固定为void、Task和Task<T>。返回类型建议用Task或Task<T>,因为void不方便捕获异常;

3、形参不能使用out和ref关键字;

4、在方法体内,需要包含1到多个await表达式,每一个表示需要异步执行的任务;

5、方法名的后缀一般约定加上Async。

//返回Task的异步方法示例:
public static async Task DownLoadDataAsync() {
var wc = new WebClient();
var result = await wc.DownloadStringTaskAsync(@"http://www.baidu.com");
} //返回Task<T>的异步方法示例:
public static async Task<String> DownLoadDataAsync() {
var wc = new WebClient();
var result = await wc.DownloadStringTaskAsync(@"http://www.baidu.com"); return result;
}

备注:Task关键字表示任务调度,一般以异步的方式执行。如果async异步方法需要返回数据,则其返回类型使用Task<T>的方式,类型T就是真正需要返回的参数类型,而异步方法执行完毕后会将需要返回的参数存储在Task变量中。

说到异步执行,到底在哪一步才进行了异步执行?这就引出了await关键字。请看下面的代码:

    class Program {
static void Main(string[] args) {
Task<String> task = DownLoadDataAsync(); Console.WriteLine("这是main主线程!"); Console.ReadKey();
} //返回Task<T>的异步方法示例:
public static async Task<String> DownLoadDataAsync() {
Console.WriteLine("进入异步方法第一步!");
var wc = new WebClient();
Console.WriteLine("进入异步方法第二步!");
var result = await wc.DownloadStringTaskAsync(@"http://www.baidu.com");
Console.WriteLine("进入异步方法第三步!");
return result;
}
}

执行结果:

可以看见,在执行异步方法的时候,当程序执行到await时,就开始了异步执行!为何能够异步呢?接下来再测试一下。

       static void Main(string[] args) {
Console.WriteLine($"1.main tid:{Thread.CurrentThread.ManagedThreadId}"); DelayAsync(); Console.WriteLine($"2.main tid:{Thread.CurrentThread.ManagedThreadId}");
Console.ReadKey();
} private static async Task DelayAsync() {
Console.WriteLine($"1.DelayAsync tid:{Thread.CurrentThread.ManagedThreadId}");
await Task.Delay().ContinueWith(t => {
Console.WriteLine($"2.DelayAsync tid:{Thread.CurrentThread.ManagedThreadId}");
});
Console.WriteLine($"3.DelayAsync tid:{Thread.CurrentThread.ManagedThreadId}"); await Task.Delay().ContinueWith(t => {
Console.WriteLine($"4.DelayAsync tid:{Thread.CurrentThread.ManagedThreadId}");
});
Console.WriteLine($"5.DelayAsync tid:{Thread.CurrentThread.ManagedThreadId}"); }

程序执行结果:

原来是到了await这个关键字时,程序单独开辟了一个线程去执行await后的代码,而后执行步骤直接返回到主线程调用异步方法后一步!

如何在main主线程执行完毕之前获取异步方法的返回结果?这就要用到Task的Wait()方法!

Task.Wait()方法的功能是等待当前这个异步任务执行完毕。相当于阻塞了主线程的继续执行,直到异步方法执行完毕,主线程才可继续执行。这就是为何异步方法的返回类型为Task的原因!

static void Main(string[] args) {
Task<String> task = DownLoadDataAsync();
task.Wait();
Console.WriteLine("这是main主线程!"); Console.ReadKey();
}

执行结果:

c# 关于async/await异步编程的浅析和使用的更多相关文章

  1. 【转】C# Async/Await 异步编程中的最佳做法

    Async/Await 异步编程中的最佳做法 Stephen Cleary 近日来,涌现了许多关于 Microsoft .NET Framework 4.5 中新增了对 async 和 await 支 ...

  2. .NET Web应用中为什么要使用async/await异步编程

    前言 什么是async/await? await和async是.NET Framework4.5框架.C#5.0语法里面出现的技术,目的是用于简化异步编程模型. async和await的关系? asy ...

  3. C#中 Thread,Task,Async/Await 异步编程

    什么是异步 同步和异步主要用于修饰方法.当一个方法被调用时,调用者需要等待该方法执行完毕并返回才能继续执行,我们称这个方法是同步方法:当一个方法被调用时立即返回,并获取一个线程执行该方法内部的业务,调 ...

  4. async/await 异步编程(转载)

    转载地址:http://www.cnblogs.com/teroy/p/4015461.html 前言 最近在学习Web Api框架的时候接触到了async/await,这个特性是.NET 4.5引入 ...

  5. async/await 异步编程

    前言 最近在学习Web Api框架的时候接触到了async/await,这个特性是.NET 4.5引入的,由于之前对于异步编程不是很了解,所以花费了一些时间学习一下相关的知识,并整理成这篇博客,如果在 ...

  6. c# async/await异步编程死锁的问题

    在异步编程中,如果稍有不注意,就会造成死锁问题.何为死锁:即两个以上的线程同时争夺被互相锁住的资源,两个都不放手. 在UI或asp.net中,容易造成死锁的代码如下所示: private void b ...

  7. .NET 中的 async/await 异步编程

    原文出处: Teroy 的博客 前言 最近在学习Web Api框架的时候接触到了async/await,这个特性是.NET 4.5引入的,由于之前对于异步编程不是很了解,所以花费了一些时间学习一下相关 ...

  8. Async await 异步编程说明

    希望在编程上有些许提高所以 最近连续2篇博客都在说明多线程和异步编程的使用,异步和多线程之间区别请自行百度,因为理解不是特别透彻就不在叙述以免误导大家,这里写下新研究整理 task  和 await ...

  9. ASP.Net中的async+await异步编程

    在.NET Framework4.5框架.C#5.0语法中,通过async和await两个关键字,引入了一种新的基于任务的异步编程模型(TAP).在这种方式下,可以通过类似同步方式编写异步代码,极大简 ...

随机推荐

  1. telnet作用和 命令使用方法详解

    什么是Telnet? 对于Telnet的认识,不同的人持有不同的观点,可以把Telnet当成一种通信协议,但是对于入侵者而言,Telnet只是一种远程登录的工具.一旦入侵者与远程主机建立了Telnet ...

  2. (转)C# Where关键词的用法

    where(泛型类型约束) where关键词一个最重要的用法就是在泛型的声明.定义中做出约束. 约束又分为接口约束.基类约束.构造函数约束.函数方法的约束,我们慢慢介绍. 接口约束 顾名思义,泛型参数 ...

  3. (转)c#反射

    1. 什么是反射2. 命名空间与装配件的关系3. 运行期得到类型信息有什么用4. 如何使用反射获取类型5. 如何根据类型来动态创建对象6. 如何获取方法以及动态调用方法7. 动态创建委托 1.什么是反 ...

  4. 数据结构(C语言版)-第3章 栈和队列

    3.1 栈和队列的定义和特点3.2 案例引入3.3 栈的表示和操作的实现3.4 栈与递归3.5 队列的的表示和操作的实现3.6 案例分析与实现 基本操作有入栈.出栈.读栈顶元素值.建栈.判断栈满.栈空 ...

  5. 百度Apollo学习(一)

    产品介绍 Nuvo-5095GC为工业电脑打开了新的篇章.作为首款面向CUDA计算.自动驾驶.深度学习及虚拟现实等新兴领域的嵌入式工控机,Nuvo-5095GC是一个高度集成.体积紧凑.稳定可靠的高性 ...

  6. django笔记 - 建站

    1,建站步骤:1)django-admin.exe startproject mysite 创建完后的目录结构: - mysite # 对整个程序进行配置 - init - settings # 配置 ...

  7. 部署的error和排查,注意服务器内存占用!

    mysqladmin: connect to server at 'localhost' failed error: 'Can't connect to local MySQL server thro ...

  8. Binomial Coefficient(二项式系数)

    In mathematics, any of the positive integers that occurs as a coefficient in the binomial theorem is ...

  9. 将本地 项目文件托管到 github

    1.新建一个本地 repository文件夹 2.将想要 托管的项目或文件 复制到repository 文件夹下 2. 右键 git bash here 输入命令 git init 生成本地仓库 4. ...

  10. hdu-4738-tarjin/割边

    http://acm.hdu.edu.cn/showproblem.php?pid=4738 求得是边权最小的割边,和求割点类似用tarjin,但要注意的是不能走从父亲过来的那一条边,在割点里那样理解 ...