技术笔记:TPL详解、使用

简介: 技术笔记:TPL详解、使用

使用时注意点


1 private async void button5_Click(object sender, EventArgs e)


2 {


3 /


4 string i1 = await F1Async();


5 MessageBox.Show("i1=" + i1);


6 string i2 = await F2Async();


7 MessageBox.Show("i2=" + i2);


8 /


9 Task[span style="color: rgba(0, 0, 255, 1)">string

10 Task[span style="color: rgba(0, 0, 255, 1)">string

11 string i1 = await //代码效果参考:http://www.lyjsj.net.cn/wz/art_23116.html

task1;

12 MessageBox.Show("i1=" + i1);


13 string i2 = await task2;


14 MessageBox.Show("i2=" + i2);


15 }


16


17 static Task[span style="color: rgba(0, 0, 255, 1)">string

18 {


19 MessageBox.Show("F1 Start");


20 return Task.Run(() => {


21 System.Threading.Thread.Sleep(1000);


22 MessageBox.Show("F1 Run");


23 return "F1";


24 });


25 }


26


27 static Task[span style="color: rgba(0, 0, 255, 1)">string

28 //代码效果参考:http://www.lyjsj.net.cn/wz/art_23124.html

{

29 MessageBox.Show("F2 Start");


30 return Task.Run(() => {


31 System.Threading.Thread.Sleep(2000);


32 MessageBox.Show("F2 Run");


33 return "F2";


34 });


35 }


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


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


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


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


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


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


异步方法的风格转换


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


await修饰与并发执行的顺序


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


eg


1 private async void button1_Click(object sender, EventArgs e)


2 {


3 HttpClient hc = new HttpClient();


4 var task1 = hc.GetStringAsync(textBox1.Text);


5 var task2 = hc.GetStringAsync(textBox2.Text);


6 var task3 = hc.GetStringAsync(textBox3.Text);


7 Task.WaitAll(task1, task2, task3);


8 label1.Text = task1.Result.Length.ToString();


9 label2.Text = task2.Result.Length.ToString();


10 label3.Text = task3.Result.Length.ToString();


11 }


View Code


在接口中使用await


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


异常处理


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


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


TPL与asp.net mvc


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


1 public async Task Index()


2 {


3 return View();


4 }


View Code


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


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


TPL常见的误区


  如果用了异步,那么就要async到底;async具有传染性;


  如果在使用异步api中掺杂了同步方法,则会打断异步方法,有可能造成数据死锁而且还会降低系统性能,so,不要轻易使用Wait、WaitAll


  只要await、WhenAll不要task.Result、Wait、WaitAll

相关文章
|
资源调度 监控 关系型数据库
在Flink CDC作业提交过程中,出现超时问题可能与多种因素有关
【2月更文挑战第8天】在Flink CDC作业提交过程中,出现超时问题可能与多种因素有关
602 11
|
消息中间件 NoSQL Java
Springboot 指定重发的次数和延迟时间,定时异步执行 重发任务
Springboot 指定重发的次数和延迟时间,定时异步执行 重发任务
1159 0
Springboot 指定重发的次数和延迟时间,定时异步执行 重发任务
|
10月前
|
数据采集 编解码 缓存
通义万相Wan2.1视频模型开源!视频生成模型新标杆,支持中文字效+高质量视频生成
2025年1月,阿里通义万相Wan2.1模型登顶Vbench榜首第一,超越Sora、HunyuanVideo、Minimax、Luma、Gen3、Pika等国内外视频生成模型。而在今天,万相Wan2.1视频生成大模型正式开源!
5371 8
|
网络协议 算法 网络性能优化
|
存储 Ubuntu Java
镜像搬运工具 Skopeo 使用
镜像搬运工具 Skopeo 使用
IDEA中返回上一步和下一步快捷键失效【Ctrl+Alt+左箭头】
这篇文章提供了解决IntelliJ IDEA中"返回上一步"和"下一步"快捷键失效的方法,通常是因为与其他软件的快捷键发生冲突,解决方法是更改快捷键设置。
网络字节序和主机序(大端和小端)详细解释--通过封装IP协议头去理解网络字节序
网络字节序和主机序(大端和小端)详细解释--通过封装IP协议头去理解网络字节序
1603 1
|
存储 算法
标定系列二、9点标定以及5点圆心标定过程(代码详解)
标定系列二、9点标定以及5点圆心标定过程(代码详解)
3026 0
|
存储 机器学习/深度学习 编译器
函数栈帧深度剖析(一篇带你牢牢掌握函数栈帧)(一)
函数栈帧深度剖析(一篇带你牢牢掌握函数栈帧)(一)
1992 0
|
机器学习/深度学习 存储 人工智能
如何让Transformer在GPU上跑得更快?快手:需要GPU底层优化
Transformer 对计算和存储的高要求阻碍了其在 GPU 上的大规模部署。在本文中,来自快手异构计算团队的研究者分享了如何在 GPU 上实现基于 Transformer 架构的 AI 模型的极限加速,介绍了算子融合重构、混合精度量化、先进内存管理、Input Padding 移除以及 GEMM 配置等优化方法。
1994 0
如何让Transformer在GPU上跑得更快?快手:需要GPU底层优化