.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 让界面飞,让双手爽的更多相关文章

  1. 关于async await的测试

    async await的教程:https://www.cnblogs.com/zhaoshujie/p/11192036.html 异步方法: private async Task<string ...

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

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

  3. async/await Task Timeout

    async/await Task Timeout 在日常的电脑使用过程中,估计最难以忍受的就是软件界面"卡住""无响应",在我有限的开发生涯中一直都是在挑战 它 ...

  4. 你眼中的async/await是什么样的?

    又到了周末的code review环节,这次code review发现了一个对async/await的理解问题.让我们直奔主题: var foodsSearch = new FoodSearchSer ...

  5. 如何避免 async/await 地狱

    简评:async/await 写着很爽,不过要注意这些问题. async/await 让我们摆脱了回调地狱,但是这又引入了 async/await 地狱的问题. 什么是 async/await 地狱 ...

  6. 重构:从Promise到Async/Await

    摘要: 夸张点说,技术的发展与历史一样,顺之者昌,逆之者亡.JS开发者们,赶紧拥抱Async/Await吧! GitHub仓库: Fundebug/promise-asyncawait 早在半年多之前 ...

  7. Promise, Generator, async/await的渐进理解

    作为前端开发者的伙伴们,肯定对Promise,Generator,async/await非常熟悉不过了.Promise绝对是烂记于心,而async/await却让使大伙们感觉到爽(原来异步可以这么简单 ...

  8. JavaScript是如何工作的:事件循环和异步编程的崛起 + 5种使用 async/await 更好地编码方式!

    摘要: 深度理解JS事件循环!!! 原文:JavaScript是如何工作的:事件循环和异步编程的崛起+ 5种使用 async/await 更好地编码方式! 作者:前端小智 Fundebug经授权转载, ...

  9. C#多线程和异步(二)——Task和async/await详解

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

随机推荐

  1. GIT和GitHub的使用总结

    目录 一.GIT初始化设置: 创建密钥 添加远程仓库 用户名邮箱配置 Clone远程仓库 创建本地仓库 代理设置 自定义操作 二.GIT基本操作 添加到暂存区区 提交 删除 版本回退 撤销修改 三.G ...

  2. AFSoundManager

    iOS audio playing (both local and streaming) and recording made easy through a complete and block-dr ...

  3. git提交代码到码云

    日常代码一般提交到github比较多,但我还是钟爱马爸爸,没错就是码云. 码云是中文版的代码托管的网站,不存在打开网速问题,使用也蛮方便的,日常自己保存托管代码已经足够,平时使用git提交代码到码云是 ...

  4. CUBE,ROLLUP 和 GROUPING

    1.用 CUBE 汇总数据 CUBE 运算符生成的结果集是多维数据集.多维数据集是事实数据的扩展,事实数据即记录个别事件的数据.扩展建立在用户打算分析的列上.这些列被称为维.多维数据集是一个结果集,其 ...

  5. objc单例的两种安全实现方案

    所有转出博客园,请您注明出处:http://www.cnblogs.com/xiaobajiu/p/4122034.html objc的单例的两种安全实现方案 首先应该知道单例的实现有两大类,一个是懒 ...

  6. mininet+floodlight使用(一)

    目录 一 .安装Floodlight 1.下载源和相关工具 2.安装(注意,需要java1.8,否则报错) 3.尝试游览器访问管理界面 4.修复查看不了floodlight 二.Mininet自定义拓 ...

  7. Vue 自动获取最新的Vue文件

    <script src="https://unpkg.com/vue/dist/vue.min.js"></script>

  8. chrome浏览器页面获取绑定返回顶部动画事件插件

    在chrome浏览器下页面加载: var top = $("body").scrollTop()  ; console.log(top)                      ...

  9. u-boot-1.1.6第1阶段分析之start.S、lowlevel_init.S文件

    学习目标: 对start.S中每一行代码,都有基本了解 通过对start.S文件分析,对ARM920T架构的CPU的启动过程,有更清楚理解 U-boot属于两个阶段的Bootloader,第一阶段的文 ...

  10. POJ 3683 Priest John's Busiest Day 【2-Sat】

    这是一道裸的2-Sat,只要考虑矛盾条件的判断就好了. 矛盾判断: 对于婚礼现场 x 和 y,x 的第一段可以和 y 的第一段或者第二段矛盾,同理,x 的第二段可以和 y 的第一段或者第二段矛盾,条件 ...