在编程的过程中,我们会遇到很多需要异步操作的场景。比如要下载一个文件,如果使用同步的方式进行下载,那么UI操作就会被卡住,这时最好能够使用异步的方式进行下载。在C#中,很早就开始支持异步的操作了,只不过早期的方法写起来有些麻烦。到了C# 5.0的时候,直接添加了两个关键字:async 和 await,这下对异步操作的支持可谓是达到了完美。下面我们就通用一个简单的 demo 看一下它们的基本用法。

下载一个文件

我们先看看用同步的方式下载一个文件:

private void btnOldDownload_Click(object sender, EventArgs e)
{
using(WebClient wc = new WebClient())
{
// 我们尝试去下载 python 的安装包。
wc.DownloadFile("https://www.python.org/ftp/python/3.5.2/python-3.5.2-amd64.exe", "python.exe");
}
lbMessage.Text = "下载完成。";
}

在执行 DownloadFile 方法的过程中,UI线程被卡死,整个的下载过程中应用程序都处于没响应的状态。这当然是不能接受的,所以我们应该使用下面的异步方式进行文件的下载。

异步下载文件

我们先看一下使用早期的异步代码去下载文件:

private void OldAsyncDownload_Click(object sender, EventArgs e)
{
using (WebClient wc = new WebClient())
{
// 我们尝试去下载 python 的安装包。
// 下载完成时会有事件通知。
wc.DownloadFileCompleted += Wc_DownloadFileCompleted;
wc.DownloadFileAsync(new Uri("https://www.python.org/ftp/python/3.5.2/python-3.5.2-amd64.exe"), "python.exe");
}
}
private void Wc_DownloadFileCompleted(object sender, AsyncCompletedEventArgs e)
{
lbMessage.Text = "下载完成。";
}

好吧,事情变得稍微有点复杂了。一个简单的下载逻辑居然被分隔到了两个方法中!在第一个方法中挂载 DownloadFileCompleted 事件,然后启动下载。下载完成后通过 DownloadFileCompleted 事件处理函数进行通知。如果您能够习惯于这样的写法,其实C# 早期提供的异步编程接口已经足够用了,因为这也正是异步操作真正的实现方式。

但是,作为程序员,我们是不会满足的,永远不会…

async await 方式

在C# 5.0 中引入了 async 和 await 关键字,它们使得异步操作的实现更加简单、容易!

private async void btnMyAsync_Click(object sender, EventArgs e)
{
using (WebClient wc = new WebClient())
{
// 我们尝试去下载 python 的安装包。
Task task = wc.DownloadFileTaskAsync("https://www.python.org/ftp/python/3.5.2/python-3.5.2-amd64.exe", "python.exe");
// 可以在这里执行代码。
await task;
}
lbMessage.Text = "下载完成。";
}

注意代码中 async 和 await 关键字的位置,这样代码就是以异步方式去执行下载逻辑,整个过程中UI 操作不会被阻塞掉。是不是很神奇呢?

这段代码最大的魔力在于它和同步下载文件的代码几乎相同!每个 人都喜欢写顺序执行的代码,这样的代码逻辑也最清晰。async 和 await 的最大优势就是把人脑感觉简单的代码转换为真正的异步操作逻辑。

C# 异步操作 async await的更多相关文章

  1. C# 异步操作 async await 的用法

    1. async与 await 成对出现 async 在方法前使用 ,方法体面面用  await . 2. 使用async 和await定义异步方法不会创建新线程. 3.await 后面一定是一个扫行 ...

  2. 异步操作async await

    async函数的特点: 语义化强 里面的await只能在async函数中使用 await后面的语句可以是promise对象.数字.字符串等 async函数返回的是一个Promsie对象 await语句 ...

  3. async/await与promise(nodejs中的异步操作问题)

    此文只是粗略介绍使用方法,欲了解核心概念请参考官方文档或其他资料. 举例写文章详情页面的时候的一个场景:首先更改文章详情中的 PV,然后读取文章详情,然后根据文章详情中文章 Id 查阅该文章评论和该文 ...

  4. 异步操作之 Promise 和 Async await 用法进阶

    ES6 提供的 Promise 方法和 ES7 提供的 Async/Await 语法糖都可以更好解决多层回调问题, 详细用法可参考:https://www.cnblogs.com/cckui/p/99 ...

  5. 【学习笔记】JS经典异步操作,从闭包到async/await

    参考文献:王仕军——知乎专栏前端周刊 感谢作者的热心总结,本文在理解的基础上,根据自己能力水平作了一点小小的修改,在加深自己印象的同时也希望能和各位共同进步... 1. 异步与for循环 抛出一个问题 ...

  6. .NET异步操作学习之一:Async/Await中异常的处理

    以前的异常处理,习惯了过程式的把出现的异常全部捕捉一遍,然后再进行处理.Async/Await关键字出来之后的确简化了异步编程,但也带来了一些问题.接下来自己将对这对关键字进行学习.然后把研究结果放在 ...

  7. [.NET] 利用 async & await 的异步编程

    利用 async & await 的异步编程 [博主]反骨仔 [出处]http://www.cnblogs.com/liqingwen/p/5922573.html  目录 异步编程的简介 异 ...

  8. [.NET] 怎样使用 async & await 一步步将同步代码转换为异步编程

    怎样使用 async & await 一步步将同步代码转换为异步编程 [博主]反骨仔 [出处]http://www.cnblogs.com/liqingwen/p/6079707.html  ...

  9. [.NET] 利用 async & await 进行异步 IO 操作

    利用 async & await 进行异步 IO 操作 [博主]反骨仔 [出处]http://www.cnblogs.com/liqingwen/p/6082673.html  序 上次,博主 ...

随机推荐

  1. Android+jsp +html 文件上传案例 已测试 成功通过

    我文件上传一直是广大读者一个问题 今天就把成功案例写下 javaweb 网页前段 <%@ page language="java" import="java.uti ...

  2. CYQ.Data 批量添加数据性能测试(每秒千、万)

    今天有网友火晋地同学进了CYQ.Data官方群了,他正在折腾了一个各大ORM性能测试的比较的软件,如下图 折腾的种类也不少: 感觉这软件折腾的不错~~~值的期待~~~ 另外,他指出CYQ.Data 在 ...

  3. TaintDroid剖析之IPC级污点传播

    TaintDroid剖析之IPC级污点传播 作者:简行.走位@阿里聚安全 前言 在前三篇文章中我们详细分析了TaintDroid对DVM栈帧的修改,以及它是如何在修改之后的栈帧中实现DVM变量级污点跟 ...

  4. Javascript基础回顾 之(三) 面向对象

    本来是要继续由浅入深表达式系列最后一篇的,但是最近团队突然就忙起来了,从来没有过的忙!不过喜欢表达式的朋友请放心,已经在写了:) 在工作当中发现大家对Javascript的一些基本原理普遍存在这里或者 ...

  5. ASP.NET安全

    ASP.NET 安全 概述 安全在web领域是一个永远都不会过时的话题,今天我们就来看一看一些在开发ASP.NET MVC应用程序时一些值得我们注意的安全问题.本篇主要包括以下几个内容 : 认证 授权 ...

  6. [.net 面向对象编程基础] (1) 开篇

    [.net 面向对象编程基础] (1)开篇 使用.net进行面向对象编程也有好长一段时间了,整天都忙于赶项目,完成项目任务之中.最近偶有闲暇,看了项目组中的同学写的代码,感慨颇深.感觉除了定义个类,就 ...

  7. 备忘-Android ViewPager 子页监听事件

    @Override public Object instantiateItem(View arg0, int arg1) { ((ViewPager) arg0).addView(mListViews ...

  8. 【转载】如何自学深度学习技术,大神Yann LeCun亲授建议

    编者按:Quora 上有网友提问:自学机器学习技术,你有哪些建议?(What are your recommendations for self-studying machine learning), ...

  9. Unity 特殊文件夹 : 位置不能随便放

    有以下几个文件夹: Assets 用来存放资源的文件夹,包括各种材质.模型等 Editor 编辑器类等脚本 Editor Default Resources Editor scripts can ma ...

  10. CSS list-style属性控制ul标签样式

    试一试 <style type="text/css" media="all"> ul { list-style-type: disc; } ul#c ...