使用时注意点

 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

  

  

最新文章

  1. jdk安装
  2. 【原创】Android selector选择器无效或无法正常显示的一点研究
  3. 【Visual Lisp】变体与安全数组
  4. 服务器操作系统应该选择 Debian/Ubuntu 还是 CentOS?
  5. Linux下nl命令的用法详解
  6. Java并发包学习--ReentrantLock
  7. 当在类中的 Parcelable 接口使用 ArrayList &lt; customObject &gt; android 系统: nullPointerException
  8. 宙斯是一个完整的Hadoop的作业平台[转]
  9. 浅谈C# 多态的魅力(虚方法,抽象,接口实现)
  10. 关于GPL329A添加摄像头驱动需要更改的配置脚本
  11. jjava Date格式是 May 07 17:44:06 CST 2018,怎么插入数据库中的timestamp格式中
  12. codeforces487A
  13. 小技巧:在线生成按钮Shape的网站
  14. ElasticSearch入门简介
  15. 07 Go 1.7 Release Notes
  16. Linux下 jenkins的安装
  17. Apache Spark Exception in thread “main” java.lang.NoClassDefFoundError: scala/collection/GenTraversableOnce$class
  18. 关于项目中根据当前数据库中最大ID生成下一个ID问题——(五)
  19. Ubbeditor的使用
  20. 撩课-Java每天5道面试题第20天

热门文章

  1. token session cookie
  2. shell脚本操作mysql数据库,使用mysql的-e参数可以执行各种sql的(创建,删除,增,删,改、查)等各种操作
  3. Uoj #218. 【UNR #1】火车管理 可持久化线段树+思维
  4. 上传菜品数据&amp;生成点餐二维码
  5. day8 面向对象编程基础
  6. github+hexo(window10)
  7. 【学习笔记】关于最大公约数(gcd)的定理
  8. EF--code first数据迁移命令
  9. 楼控-西门子-insight使用-软件重新授权
  10. [MGR——Mysql的组复制之单主模式 ]详细搭建部署过程