使用时注意点

 private async void button5_Click(object sender, EventArgs e)
{
/*
string i1 = await F1Async();
MessageBox.Show("i1=" + i1);
string i2 = await F2Async();
MessageBox.Show("i2=" + i2);
*/
Task<string> task1 = F1Async();
Task<string> task2 = F2Async();
string i1 = await task1;
MessageBox.Show("i1=" + i1);
string i2 = await task2;
MessageBox.Show("i2=" + i2);
} static Task<string> F1Async()
{
MessageBox.Show("F1 Start");
return Task.Run(() => {
System.Threading.Thread.Sleep();
MessageBox.Show("F1 Run");
return "F1";
});
} static Task<string> F2Async()
{
MessageBox.Show("F2 Start");
return Task.Run(() => {
System.Threading.Thread.Sleep();
MessageBox.Show("F2 Run");
return "F2";
});
}

如上两个异步方法,在调用时,第一种调用提示框会按步骤弹出,而第二种则混乱的弹出,但这也不难理解因为多线程本来就是分片执行不按代码顺序;

第二种写法的await是作为一个最后的保险作用,它的意义在于如果开始就执行了ok,如果没执行则这步该执行了

不能使用async修饰而要调用异步方法怎么办?

  出现这种情况比较少,此时可以获得Task<T>类型的返回值,获取Task<T>.Result()方法,终止异步;

  但请注意尽量少的使用Result()方法,他会造成数据上下文的死锁问题。

如果返回值就是一个立即可以随手可得的值,那么就用 Task.FromResult();

异步方法的风格转换

Task.Factory.FromAsync()把 IAsyncResult 转换为 Task,这样 APM 风格的 api 也可以用 await 来调用

await修饰与并发执行的顺序

被await修饰的异步方法,一定会按照顺序执行并结束,所以如果没有顺序要求可以不使用await修饰并发任务

eg

 private async void button1_Click(object sender, EventArgs e)
{
HttpClient hc = new HttpClient();
var task1 = hc.GetStringAsync(textBox1.Text);
var task2 = hc.GetStringAsync(textBox2.Text);
var task3 = hc.GetStringAsync(textBox3.Text);
Task.WaitAll(task1, task2, task3);
label1.Text = task1.Result.Length.ToString();
label2.Text = task2.Result.Length.ToString();
label3.Text = task3.Result.Length.ToString();
}

在接口中使用await

在接口定义是不能给接口做await修饰,然而为了增加可读性,在方法明后添加async的特殊表示,在实现类中去添加await修饰即可

异常处理

TPL中,如果程序中出现异常,除非进行try...catch,否则有可能是感觉不到出了异常....

TPL中有时会抛出AggregateException可以同时catch住多个异常,这通常发生在并行多个任务的情况下

TPL与asp.net mvc

    1.  返回值改为Task<ActionResult>即可,如果方法标记为async,连自己创建Task都省了

 public async Task<ActionResult> Index()
{
return View();
}

    2.  为什么asp.net中用mvc能提升系统性能?

      准确来讲,不是提升性能,不会提高访问速度,而是提升服务器的“吞吐量”,也就是可以处理的并发请求数

TPL常见的误区

  1.   如果用了异步,那么就要async到底;async具有传染性;
  2.   如果在使用异步api中掺杂了同步方法,则会打断异步方法,有可能造成数据死锁而且还会降低系统性能,so,不要轻易使用Wait、WaitAll
  3.   只要await、WhenAll不要task.Result、Wait、WaitAll

  

  

TPL详解、使用的更多相关文章

  1. 基于H5的微信支付开发详解

    这次总结一下用户在微信内打开网页时,可以调用微信支付完成下单功能的模块开发,也就是在微信内的H5页面通过jsApi接口实现支付功能.当然了,微信官网上的微信支付开发文档也讲解的很详细,并且有实现代码可 ...

  2. ****基于H5的微信支付开发详解[转]

    这次总结一下用户在微信内打开网页时,可以调用微信支付完成下单功能的模块开发,也就是在微信内的H5页面通过jsApi接口实现支付功能.当然了,微信官网上的微信支付开发文档也讲解的很详细,并且有实现代码可 ...

  3. JSON详解(转)

    JSON详解 JSON的全称是”JavaScript Object Notation”,意思是JavaScript对象表示法,它是一种基于文本,独立于语言的轻量级数据交换格式.XML也是一种数据交换格 ...

  4. Ext.Net学习笔记22:Ext.Net Tree 用法详解

    Ext.Net学习笔记22:Ext.Net Tree 用法详解 上面的图片是一个简单的树,使用Ext.Net来创建这样的树结构非常简单,代码如下: <ext:TreePanel runat=&q ...

  5. opencart 模块开发详解

    opencart 模块开发详解 由 xiekanxiyang » 2013年 7月 11日 10:17 pm opencart 将页面分成若干模块, 每个模块可以有多个实例(可能这样说不是很恰当) 每 ...

  6. JSON详解(转载)

    JSON详解 阅读目录 JSON的两种结构 认识JSON字符串 在JS中如何使用JSON 在.NET中如何使用JSON 总结 JSON的全称是”JavaScript Object Notation”, ...

  7. [转]application.properties详解 --springBoot配置文件

    本文转载:http://blog.csdn.net/lpfsuperman/article/details/78287265###; # spring boot application.propert ...

  8. application.properties详解 --springBoot配置文件【转载】

    # spring boot application.properties配置的各个属性详解 # 该示例文件作为标准提供.(官方文档 翻译过来的) # 还是花了些功夫翻译,各位如果转发,请留下本文地址, ...

  9. 详解用webpack的CommonsChunkPlugin提取公共代码的3种方式(注意webpack4.0版本已不存在)

    Webpack 的 CommonsChunkPlugin 插件,负责将多次被使用的 JS 模块打包在一起. CommonsChunkPlugin 能解决的问题 在使用插件前,考虑几个问题: 对哪些 c ...

随机推荐

  1. button提交表单 a标签提交表单

    <form name="searchForm" id="searchForm" method="get" action="/ ...

  2. jquery-pjax使用说明

    pjax = pushState + ajax .--. / \ ## a a ( '._) |'-- | _.\___/_ ___pjax___ ."\> \Y/|<'. '. ...

  3. X.509 certificate

    A digital certificate is a collection of data used to securely distribute the public half of a publi ...

  4. 【转载自JHBlogs的博客】postman接口自动化,环境变量的用法详解(附postman常用的方法)

    在实现接口自动测试的时候,会经常遇到接口参数依赖的问题,例如调取登录接口的时候,需要先获取登录的key值,而每次请求返回的key值又是不一样的,那么这种情况下,要实现接口的自动化,就要用到postma ...

  5. loadrunner录制不了

    我在使用loadrunner过程中遇到的问题是,录制脚本时候能够打开firefox,但是无法打开IE,降低IE版本以后仍然不行. 1.在录制脚本时Start Recoding中,默认如下,这样有可能I ...

  6. 微信小程序-蓝牙连接

    最近的项目需要使用小程序的蓝牙功能与硬件设备进行连接相互传送数据指令,联调过程中发现一些问题,于是想着记录下来,方便以后查看! 1.0一般使用蓝牙功能肯定是想连接某一个蓝牙设备,所以需要知道这个蓝牙设 ...

  7. [luogu3244 HNOI2015] 落忆枫音(容斥原理+拓扑排序)

    传送门 Description 给你一张 n 个点 m 条边的DAG,1 号节点没有入边.再向这个DAG中加入边 x→y ,求形成的新图中以 1 为根的外向树形图数 模 10^9+7 . Input ...

  8. SSH(远程登录)

    在linux中SSH服务对应两个配置文件: ssh特点:在传输数据的时候,对文件加密后传输. ssh作用:为远程登录会话和其他网络服务提供安全性协议. ssh小结: 1.SSH是安全的加密协议,用于远 ...

  9. Linux启用ftp服务及连接

    虚拟机的系统是centos6.3 第一步.启动ftp service vsftpd restart 提示 vsftpd: 未被识别的服务 解决方法是升级vsftpd服务 yum install vsf ...

  10. js中window.location的用法

    用window.location处理解析当前页面URL window.location 对象所包含的属性 属性 描述 hash 从井号(#)开始的URL(锚点) host 主机名和当前URL的端口号 ...