async+await 让界面飞,让双手爽
.net 4.5已经发布很久了,但是一直也没有静下心来好好的研究微软给开发者带来的喜悦。
今天我将简单的介绍下 async + await 这对搭档的出现,如何让频繁假死的界面飞起来(其实只是不再阻塞UI线程而已,标题党一下)
建议大家先了解下 IAsyncReuslt ,做过异步的应该都知道它怎么用吧?用过socket的人也几乎对它了如指掌了,不知道的谷歌一下吧,我就不贴上来了。
- async + await 让界面飞
园子里“滴答的雨”已经详细解释过了,我这里只贴一个例子以便跟我写的方式进行对比。
其中 for 循环是为了增加网络延迟,模拟一定的加载时间而已,网速好的同学可以自行放宽。
private async void button1_Click(object sender, EventArgs e)
{
string s = await Test();
MessageBox.Show(s);
} private async Task<string> Test()
{
string str = null; for (int i = 0; i < 10; i++)
{
using (WebClient wc = new WebClient())
{
str = await wc.DownloadStringTaskAsync("http://www.baidu.com");
}
} return str;
}
- 让双手爽,让代码简洁,让假死瞬间复活
现在我想让我的代码变成这个样子,尽量少的改动之前的函数,同时新写的方法也不需要考虑返回Task<T>
其实区别在于两点:
1. await new FastAsync<string>().TaskAsync();
2.TestAsync 函数本身没有引用到 async 或者 await ,也就是说逻辑函数相比较之前的版本来说没有做出改动。
private async void button1_Click(object sender, EventArgs e)
{
string s = await new FastAsync<string>().TaskAsync(TestAsync);
MessageBox.Show(s);
} private string TestAsync()
{
string str = null; for (int i = 0; i < 10; i++)
{
using (WebClient wc = new WebClient())
{
str = wc.DownloadString("http://www.baidu.com");
}
} return str;
}
- 改造async + await的使用方式,提供快速操作函数
通过上面的代码应该已经发现问题了,就是 FastAsync<string> 是哪里来的呢?这就是今天要说的重点了。代码量不多,只没特别的技术含量只是需要动下脑而已。
public class FastAsync<T>
{
TaskCompletionSource<T> m_tcs; public Task<T> TaskAsync(Func<T> func)
{
m_tcs = new TaskCompletionSource<T>();
IAsyncResult result = func.BeginInvoke(new AsyncCallback(AsyncResult), func); return m_tcs.Task;
} private void AsyncResult(IAsyncResult result)
{
Func<T> func = result.AsyncState as Func<T>;
T entity = func.EndInvoke(result);
m_tcs.SetResult(entity);
}
}
是不是很简单?
或许大家有更好的方法,欢迎交流,本文的实现方式只是我一时兴起想出来的,目的也很简单,就是想简化代码。
当然,这也未必是最简单的实现方式,在这里我只能说我提供的是一个思路,一个简化版实现方式而已,真实项目中还要继续改进和扩展。如果您喜欢,麻烦点个赞?哈哈^_^
async+await 让界面飞,让双手爽的更多相关文章
- 关于async await的测试
async await的教程:https://www.cnblogs.com/zhaoshujie/p/11192036.html 异步方法: private async Task<string ...
- [.NET] 怎样使用 async & await 一步步将同步代码转换为异步编程
怎样使用 async & await 一步步将同步代码转换为异步编程 [博主]反骨仔 [出处]http://www.cnblogs.com/liqingwen/p/6079707.html ...
- async/await Task Timeout
async/await Task Timeout 在日常的电脑使用过程中,估计最难以忍受的就是软件界面"卡住""无响应",在我有限的开发生涯中一直都是在挑战 它 ...
- 你眼中的async/await是什么样的?
又到了周末的code review环节,这次code review发现了一个对async/await的理解问题.让我们直奔主题: var foodsSearch = new FoodSearchSer ...
- 如何避免 async/await 地狱
简评:async/await 写着很爽,不过要注意这些问题. async/await 让我们摆脱了回调地狱,但是这又引入了 async/await 地狱的问题. 什么是 async/await 地狱 ...
- 重构:从Promise到Async/Await
摘要: 夸张点说,技术的发展与历史一样,顺之者昌,逆之者亡.JS开发者们,赶紧拥抱Async/Await吧! GitHub仓库: Fundebug/promise-asyncawait 早在半年多之前 ...
- Promise, Generator, async/await的渐进理解
作为前端开发者的伙伴们,肯定对Promise,Generator,async/await非常熟悉不过了.Promise绝对是烂记于心,而async/await却让使大伙们感觉到爽(原来异步可以这么简单 ...
- JavaScript是如何工作的:事件循环和异步编程的崛起 + 5种使用 async/await 更好地编码方式!
摘要: 深度理解JS事件循环!!! 原文:JavaScript是如何工作的:事件循环和异步编程的崛起+ 5种使用 async/await 更好地编码方式! 作者:前端小智 Fundebug经授权转载, ...
- C#多线程和异步(二)——Task和async/await详解
一.什么是异步 同步和异步主要用于修饰方法.当一个方法被调用时,调用者需要等待该方法执行完毕并返回才能继续执行,我们称这个方法是同步方法:当一个方法被调用时立即返回,并获取一个线程执行该方法内部的业务 ...
随机推荐
- 随手练——LintCode 433 - 小岛数量
LintCode 433: https://www.lintcode.com/problem/number-of-islands/description LintCode 434: https://w ...
- leetcode 1.Two Sum 、167. Two Sum II - Input array is sorted 、15. 3Sum 、16. 3Sum Closest 、 18. 4Sum 、653. Two Sum IV - Input is a BST
1.two sum 用hash来存储数值和对应的位置索引,通过target-当前值来获得需要的值,然后再hash中寻找 错误代码1: Input:[3,2,4]6Output:[0,0]Expecte ...
- String 的字面量、常量池、构造函数和intern()函数
一.内存中的 String 对象 Java 的堆和栈 对于基本数据类型变量和对象的引用,也就是局部变量表属于栈内存: 而通过 new 关键字和 constructor 创建的对象存放在堆内存: 直接的 ...
- 利用maven开发springMVC项目(三)——数据库配置
前两节介绍了开发环境的搭建以及框架的配置 现在主要介绍在eclipse中如何将SpringMVC.hibernate.mysql数据库结合起来. 数据库配置 下面,就要通过一个简单的例子,来介绍Spr ...
- PAT——1044. 火星数字
火星人是以13进制计数的: 地球人的0被火星人称为tret. 地球人数字1到12的火星文分别为:jan, feb, mar, apr, may, jun, jly, aug, sep, oct, no ...
- 一个实现 手机端“输入验证码 ”效果Demo
之前在“掘金”上看到这样一个demo 我觉得很有意思,于是今天把它搬下来,记在自己的“小本本”里也许会对以后的项目有点用,若要自己去实现这样一个案例也能实现,但是可能没有那么“妙”. 想法: 1.使用 ...
- Page Object 设计模式-PO
1.传统测试用例实现的弊端: 易读性差 复用性差 可维护性差 扩展性差 2.PO 设计模式图: 3.Page Object 的核心要素: 抽象封装一个 BasePage 基类,基类应该拥有一个只想 w ...
- es6解构赋值的几个用法
1.解构赋值可以轻松获取对象或者数组中的数据 var jsonData = { data: "111", data2: ["test","test2& ...
- jquery购物车添加功能
<html> <head> <meta charset="UTF-8"> <title></title> <scr ...
- 如何发布自己模块到NPM
创建项目 npm init name: (my-npm) version: (1.0.0) description: 0.0.1 entry point: (index.js) test comman ...