当前位置: 首页 > news >正文

Metro Style App 异步-简洁而不简单的异步

Metro Style App 异步-简洁而不简单的异步

 

简洁的异步

在win8 中异步被大大的加强,在code 中占到相当大的比重,按照建议任何耗时超过0.5S的操作都应该使用异步,幸运的是在.NET 4.5中异步的开发相当简单

 

(明亮的类库都表示需要异步来操作,可见多么重要)

 

 

  

View Code

 

这是最原始的方法,当Method() 执行时间过长则会阻塞UI线程 ,在以前我们可能有多种写法来解决,但是在.NET 4.5中 这一切都被大大的简化了

只要在你需要的地方打上async 和await  关键字即可,async 必须在方法名和返回类型前

有async 则必须有await ,异步方法的返回类型必须是Task<T> 即 若要返回一个bool类型则方法声明

    

复制代码
    private async Task<bool> test()

{

await Method()

return true;

}
复制代码
复制代码

 

在这里要注意的是方法会等待Method 执行完毕后才会返回true, 但是不同的是不会阻塞UI线程 在test()方法内部可以操控UI元素,并且UI 不会假死,你需要注意的是这并不是什么神奇的语法,只是一些语法糖而已,犀利的编译器。

 

注意async不能用于 属性,构造函数,

 

异步的泥潭

对于win8 中的异步 在初学阶段我喜欢用泥潭这个词,有可能你会陷入一些奇怪的异步问题,因为在一些情况下 并不总是按照你想象的那样方式运行,可能会死锁 可能会没有等待方法完成就接着往下执行还有很多很多……这里给出几条个人建议

  1. 如果有  void 需要异步执行的方法则把void 换成Task

    

View Code

 

我们执行这个btnWrite_Click的异步方法的时候会先进入WriteData() 中 按照上文所说的应该是等待WriteData 执行完毕后才会接着执行  savedate 方法,但是遗憾的是它并不会等待WriteData 执行完毕 就接着执行 savedate了 ,这是因为虽然WriteData 是个异步方法 但是这个异步是针对于 Method(),WriteData  本质是异步方法但是不需要等待 ,但是我们需要一个等待的异步…

View Code

 

当我们把void 换成Task 时候 就明确的WriteData 定义为一个需要等待的异步方法 ,这样  btnWrite_Click 就会按照我们设想的那样会等待WriteData 执行完毕 才会执行savedate

 

  1. 用ConfigureAwait(false) 避免死锁

让我们来完善我们的文件读写,当写入文件失败的时候我们可能要记入log

复制代码
public async void btnWrite_Click(object sender, Windows.UI.Xaml.RoutedEventArgs e)

{

try

{

await WriteData();

btnWrite.Content = "ok";

}

catch (Exception)

{

WriteLog();

}

}

private async Task WriteData()

{

await Method()

}

private async Task WriteLog ()

{

await Method2()

}
复制代码
复制代码


      

但是遗憾的是在catch 中我们无法使用await 关键字,既然无法使用await ,那么对于异步方法 我们可以调用  WriteLog().Start() 来开始 ,但是我们无法确保WriteLog()什么时候执行完毕 ,也许在程序关闭了,还在写日志 .这显然不是我们所预期的, 或者我们可以尝试   WriteLog().GetAwaiter();   这个主意不错可是当我们正在运行的时候会发现 程序死锁了,应为在WriteLog().GetAwaiter(); 

UI线程将会被阻塞 等待WriteLog方法执行完毕,返回控制权,在WriteLog内部会等待Method2()执行完毕 返回控制权.主意Method2 执行在其他线程(来自线程池) ,但是WriteLog则在UI线程执行… UI线程已经被阻塞,死锁就在Method2 执行完毕后发生.幸运的是我们还有办法解决 。

我们可以在WriteLog().ConfigureAwait(false) MSDN解释如下

 

  • Task.ConfigureAwait(bool continueOnCapturedContext)
    • true (default)
      • Post continuation back to the current context/scheduler
      • false
        • If possible, continue executing where awaited task completes

个人觉得和Task.Yield();  很相似 .但是Task.Yield();有不确定性 并且需要await 支持。

Source Address



本文转自Work Hard Work Smart博客园博客,原文链接:http://www.cnblogs.com/linlf03/archive/2012/03/09/2388207.html,如需转载请自行联系原作者

相关文章:

  • centos 7 环境变量PATH 、 cp命令、mv命令、 文档查看cat/more/less/head/tail
  • Oracle基本操作命令
  • 【Java学习笔记之三十四】超详解Java多线程基础
  • An unexpected exception has been detected in native code outside the VM
  • FFmpeg AVPacket和AVFrame区别
  • 我为什么选择Angular 2?
  • 安装OpenStack问题
  • Java 大写字母转下划线加小写字母
  • CCF 201503-3 节日
  • LVS专题-(1)LVS基本介绍
  • 杭电2054
  • 赵丽颖人生第一次演讲——我小小的英雄主义,用行动证明坚持的意义
  • zabbix snmp 监控Esxi6.0 无法开启snmp服务
  • Python[7] :Python制作json格式和shell格式的API
  • 微服务下的网关与容错
  • JS中 map, filter, some, every, forEach, for in, for of 用法总结
  • 2017届校招提前批面试回顾
  • es6--symbol
  • leetcode-27. Remove Element
  • node和express搭建代理服务器(源码)
  • Python_网络编程
  • SpiderData 2019年2月25日 DApp数据排行榜
  • Theano - 导数
  • vue和cordova项目整合打包,并实现vue调用android的相机的demo
  • 阿里云应用高可用服务公测发布
  • 不发不行!Netty集成文字图片聊天室外加TCP/IP软硬件通信
  • 分布式事物理论与实践
  • 聊一聊前端的监控
  • 每个JavaScript开发人员应阅读的书【1】 - JavaScript: The Good Parts
  • 腾讯视频格式如何转换成mp4 将下载的qlv文件转换成mp4的方法
  • 小程序滚动组件,左边导航栏与右边内容联动效果实现
  • 一道面试题引发的“血案”
  • 原生JS动态加载JS、CSS文件及代码脚本
  • ​LeetCode解法汇总2182. 构造限制重复的字符串
  • #Linux(帮助手册)
  • #单片机(TB6600驱动42步进电机)
  • (Python) SOAP Web Service (HTTP POST)
  • (Redis使用系列) Springboot 使用redis实现接口Api限流 十
  • (SpringBoot)第二章:Spring创建和使用
  • (翻译)terry crowley: 写给程序员
  • (分布式缓存)Redis持久化
  • (附源码)spring boot建达集团公司平台 毕业设计 141538
  • (剑指Offer)面试题41:和为s的连续正数序列
  • (三)Hyperledger Fabric 1.1安装部署-chaincode测试
  • .Net Core 中间件验签
  • .NET Core6.0 MVC+layui+SqlSugar 简单增删改查
  • .NET 表达式计算:Expression Evaluator
  • .NET 除了用 Task 之外,如何自己写一个可以 await 的对象?
  • .vollhavhelp-V-XXXXXXXX勒索病毒的最新威胁:如何恢复您的数据?
  • @Transaction注解失效的几种场景(附有示例代码)
  • [android学习笔记]学习jni编程
  • [BZOJ2850]巧克力王国
  • [CSS]浮动
  • [C语言]——函数递归
  • [HNOI2008]玩具装箱toy