await异步的,容易理解一点
C# 5.0中引入了async 和 await。这两个关键字可以让你更方便的写出异步代码。
看个例子:
- public class MyClass
- {
- public MyClass()
- {
- DisplayValue(); //这里不会阻塞
- System.Diagnostics.Debug.WriteLine("MyClass() End.");
- }
- public Task<double> GetValueAsync(double num1, double num2)
- {
- return Task.Run(() =>
- {
- for (int i = 0; i < 1000000; i++)
- {
- num1 = num1 / num2;
- }
- return num1;
- });
- }
- public async void DisplayValue()
- {
- double result = await GetValueAsync(1234.5, 1.01);//此处会开新线程处理GetValueAsync任务,然后方法马上返回
- //这之后的所有代码都会被封装成委托,在GetValueAsync任务完成时调用
- System.Diagnostics.Debug.WriteLine("Value is : " + result);
- }
- }
上面在MyClass的构造函数里调用了async关键字标记的异步方法DisplayValue(),DisplayValue()方法里执行了一个await关键字标记的异步任务GetValueAsync(),这个异步任务必须是以Task或者Task<TResult>作为返回值的,而我们也看到,异步任务执行完成时实际返回的类型是void或者TResult,DisplayValue()方法里await GetValueAsync()之后的所有代码都会在异步任务完成时才会执行。
DisplayValue()方法实际执行的代码如下:
- public void DisplayValue()
- {
- System.Runtime.CompilerServices.TaskAwaiter<double> awaiter = GetValueAsync(1234.5, 1.01).GetAwaiter();
- awaiter.OnCompleted(() =>
- {
- double result = awaiter.GetResult();
- System.Diagnostics.Debug.WriteLine("Value is : " + result);
- });
- }
可以看到,async和await关键字只是把上面的代码变得更简单易懂而已。
程序的输出如下:
MyClass() End.
Value is : 2.47032822920623E-322
以下是我写的一个静态类,可以方便将一个普通Function执行异步调用:
- public static class TaskAsyncHelper
- {
- /// <summary>
- /// 将一个方法function异步运行,在执行完毕时执行回调callback
- /// </summary>
- /// <param name="function">异步方法,该方法没有参数,返回类型必须是void</param>
- /// <param name="callback">异步方法执行完毕时执行的回调方法,该方法没有参数,返回类型必须是void</param>
- public static async void RunAsync(Action function, Action callback)
- {
- Func<System.Threading.Tasks.Task> taskFunc = () =>
- {
- return System.Threading.Tasks.Task.Run(() =>
- {
- function();
- });
- };
- await taskFunc();
- if (callback != null)
- callback();
- }
- /// <summary>
- /// 将一个方法function异步运行,在执行完毕时执行回调callback
- /// </summary>
- /// <typeparam name="TResult">异步方法的返回类型</typeparam>
- /// <param name="function">异步方法,该方法没有参数,返回类型必须是TResult</param>
- /// <param name="callback">异步方法执行完毕时执行的回调方法,该方法参数为TResult,返回类型必须是void</param>
- public static async void RunAsync<TResult>(Func<TResult> function, Action<TResult> callback)
- {
- Func<System.Threading.Tasks.Task<TResult>> taskFunc = ()=>
- {
- return System.Threading.Tasks.Task.Run(()=>
- {
- return function();
- });
- };
- TResult rlt = await taskFunc();
- if(callback != null)
- callback(rlt);
- }
- }
使用很简单,将方法名作为参数传进去就行了,最常用的是把很耗时的序列化函数传进去,以免阻塞UI进程,造成卡顿现象,影响用户体验。
await异步的,容易理解一点的更多相关文章
- Promise 和async/await 的使用理解
Promise 和async/await 的使用理解 1. new Promise时就会开始执行语句. new Promise(resolve => resolove('成功信息') ) ...
- Promise, Generator, async/await的渐进理解
作为前端开发者的伙伴们,肯定对Promise,Generator,async/await非常熟悉不过了.Promise绝对是烂记于心,而async/await却让使大伙们感觉到爽(原来异步可以这么简单 ...
- .Net异步关键字async/await的最终理解
由于之前的项目中自己突然想试试异步action,于是使用了一下,突然就对异步action的执行流程以及原理及其好处产生了兴趣,再参考了一些文章之后,就做了下归类. 我们可以不需要太深入的理解底层,但是 ...
- js中的同步和异步的个人理解(转)
你应该知道,javascript语言是一门“单线程”的语言,不像java语言,类继承Thread再来个thread.start就可以开辟一个线程,所以,javascript就像一条流水线,仅仅是一条流 ...
- async/await的实质理解
async/await关键字能帮助开发者更容易地编写异步代码.但不少开发者对于这两个关键字的使用比较困惑,不知道该怎么使用.本文就async/await的实质作简单描述,以便大家能更清楚理解. 一.a ...
- promise 的基本概念 和如何解决js中的异步编程问题 对 promis 的 then all ctch 的分析 和 await async 的理解
* promise承诺 * 解决js中异步编程的问题 * * 异步-同步 * 阻塞-无阻塞 * * 同步和异步的区别? 异步;同步 指的是被请求者 解析:被请求者(该事情的处理者)在处理完事情的时候的 ...
- async & await 异步编程的一点巧方法
await 关键字不会创建新的线程,而是由Task任务或是FCL中的xxxAsync等方法创建的线程,而且这里创建的线程都是基于线程池创建的工作线程,属于后台线程. await关键字会阻塞/暂停调用它 ...
- v8是怎么实现更快的 await ?深入理解 await 的运行机制
最近v8团队发表一篇博客Faster async functions and promises, 预计在v7.2版本实现更快的异步函数和promise. 文章内容看起来不是很容易理解,背后的原理比较隐 ...
- ES7的Async/Await的简单理解
Async/Await 的个人见解 正文: async,顾名思义,一个异步执行的功能,而 await 则是配合 async 使用的另一个关键字,也是闻字识其意,就是叫你等待啦! 二者配合食用效果更佳哦 ...
随机推荐
- 备份与还原ORACLE数据库(通过CMD命令执行)
31.1:(若用程序调用cmd,则在备份和还原 末尾语句加上 2>&1 ,直接运行则不需要加) --备份: 1) exp SA/"""abc@123 ...
- 【iCore1S 双核心板_FPGA】例程十七:基于双口RAM的ARM+FPGA数据存取实验
实验现象: 核心代码: module DUAL_PORT_RAM( input CLK_12M, inout WR, input RD, input CS0, :]A, :]DB, output FP ...
- HTML Table to Json
HTML 表格输出JSON <table class="table table-striped table-bordered table-hover dataTable no-foot ...
- .NET Core 2.1 IIS 部署 出现500.19 错误
HTTP 错误 500.19 - Internal Server Error 无法访问请求的页面,因为该页的相关配置数据无效. 最后发现是由于项目从 .NET Core 1.0 升级到 .NET Co ...
- Laravel-mix 中文文档
镜像地址 : https://segmentfault.com/a/1190000015049847原文地址: Laravel Mix Docs 概览 基本示例 larave-mix 是位于w ...
- Jquery EasyUI Combotree和 EasyUI tree展开所有父节点和获取完整路径
Jquery EasyUI Combotree展开所有父节点 Jquery EasyUI Combotree获取树完整路径 Jquery EasyUI tree展开所有父节点 Jquery EasyU ...
- 【Python】博客信息爬取-微信消息自动发送
1.环境安装 python -m pip install --upgrade pip pip install bs4 pip install wxpy pip install lxml 2.博客爬取及 ...
- Flask学习笔记(3)--路由
0x01 参数传递 传递参数的语法是: /<参数名>/,然后在视图函数中,也要定义同名的参数. 参数的数据类型: 1.如果没有指定具体的数据类型,那么默认就是使用string 数据类型. ...
- python装饰器语法
@就是decorator,早Python的高效开发中会用到,当然和java的annotation有一定的相似,但又不完全相同,看这篇文章:https://blog.csdn.net/zkp_987/a ...
- Oracle考试题作业
新建一张学员信息表(student),要求:1. 字段如下:学号(sid),姓名(name),性别(sex),年龄(age),地址(address).2. 分别为字段添加约束:学号为主键,姓名为非空, ...