c# async和await 用法(阻塞与不阻塞)
void PagePaint()
{
Console.WriteLine("Paint Start");
Paint();
Console.WriteLine("Paint End");
} void Paint()
{
Rendering("Header");
Rendering(RequestBody());
Rendering("Footer");
} string RequestBody()
{
Thread.Sleep();
return "Body";
}
假设有这么个页面布局的方法,依次对头部、主体和底部进行渲染,头部和底部是固定的内容,而主体需要额外请求。
这里用Sleep模拟网络延时,Rendering方法其实也就是对Console.WriteLine的简单封装而已。。。
PagePaint运行过后,结果是这样的:
Paint Start
Header
Body
Footer
Paint End
挺正常的结果,但是Header渲染完以后页面就阻塞了,这个时候用户没法对Header进行操作。
于是就进行这样的修正:
async void Paint()
{
Rendering("Header");
Rendering(await RequestBody());
Rendering("Footer");
} async Task<string> RequestBody()
{
return await Task.Run(() =>
{
Thread.Sleep();
return "Body";
});
}
运行结果变成了这样:
Paint Start
Header
Paint End
Body
Footer
这样就能在Header出现之后不阻塞主线程了。
不过呢,Footer一直都得等到Body渲染完成后才能被渲染,这个逻辑现在看来还没问题,因为底部要相对于主体进行布局。
然而我这时候又想给页面加一个广告,而且是fixed定位的那种,管啥头部主体想盖住就盖住,你们在哪它不管。
比如这样写:
async void Paint()
{
Rendering(await RequestAds());
Rendering("Header");
Rendering(await RequestBody());
Rendering("Footer");
}
出现了很严重的问题,头部都得等广告加载好了才能渲染,这样显然是不对的。
所以应该改成这样:
async void Paint()
{
PaintAds();
Rendering("Header");
Rendering(await RequestBody());
Rendering("Footer");
} async void PaintAds()
{
string ads = await Task.Run(() =>
{
Thread.Sleep();
return "Ads";
});
Rendering(ads);
}
这样的运行结果就算令人满意了:
Paint Start
Header
Paint End
Ads
Body
Footer
总结:
1.Paint()加async表示是可异步的,当里面有awit的时候,调用Paint的线程会异步处理Paint()后面的代码
2.Paint()里面是同步的,想要实现异步效果,再嵌套个加async的异步方法.
总之async 不加awit就是异步,加了就同步处理
实例测试:
private void button1_Click(object sender, EventArgs e)
{
textBox1.Text = "start\r\n";
aaa();//异步方法,如果里面有awits的时候启动异步,执行下一条代码=====>>"textBox1.Text += "dfgfdgdfdfg\r\n";"
textBox1.Text += "dfgfdgdfdfg\r\n";
} public async void aaa()
{
List<Task<PP>> plist = new List<Task<PP>>();
for (int i = ; i < ; i++)
{
Task<PP> p = Getp(i);
// p.Start();
plist.Add(p);
//PP p = await Getp(i);
//textBox1.Text +=p.Name + "\r\n";
}
textBox1.Text += "11111111111111111111\r\n";
while (plist.Count>)
{
try
{
Task<PP> imageTask = await Task.WhenAny(plist);
plist.Remove(imageTask); PP pppppp = await imageTask;
textBox1.Text += pppppp.Name + "\r\n"; }
catch (Exception exc) { MessageBox.Show(exc.Message); } }
textBox1.Text += "22222222222222222222\r\n";
}
public async Task<PP> Getp(int index)
{
PP p=new PP ();
switch (index)
{
case : Thread.Sleep();
p.Index=index;
p.Name=index.ToString();
return p; case :
return await Task.Run(() =>
{
Thread.Sleep();
p.Index = index;
p.Name = index.ToString();
return p;
});
case :
return await Task.Run(() =>
{
Thread.Sleep();
p.Index = index;
p.Name = index.ToString();
return p;
});
case :
return await Task.Run(() =>
{
Thread.Sleep();
p.Index = index;
p.Name = index.ToString();
return p;
});
default:
return await Task.Run(() =>
{
Thread.Sleep();
p.Index = index;
p.Name = index.ToString();
return p;
}); }
}
c# async和await 用法(阻塞与不阻塞)的更多相关文章
- async和await用法
原文:async和await用法 要理解async和await的用法,首先要了解Task相关知识,这里不做说明,因为这不是本文的重点. 如果你已经对Task很了解,那么如何使用async和await, ...
- async和await用法(Task)
原文:async和await用法 要理解async和await的用法,首先要了解Task相关知识,这里不做说明,因为这不是本文的重点. 如果你已经对Task很了解,那么如何使用async和await, ...
- Thread&ThreadPool、Parallel、Async和Await用法总结
1.线程和线程池Thread&ThreadPool //线程初始化时执行方法可以带一个object参数,为了传入自定义参数,所以执行需单独调用用于传参. Console.WriteLine(& ...
- 浅谈async函数await用法
今天状态不太好,睡久了懵一天. 以前只是了解过async函数,并还没有很熟练的运用过,所以先开个坑吧,以后再结合实际来更新下,可能说的有些问题希望大家指出. async和await相信大家应该不陌生, ...
- C#中async和await用法
.net 4.5中新增了async和await这一对用于异步编程的关键字. async放在方法中存在await代码的方法中,await放在调用返回Task的方法前. class Class1 { pr ...
- C# Async与Await用法
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- 【C#复习总结】 Async 和 Await 的异步编程
谈到异步,必然要说下阻塞,在知乎上看到了网友举的例子非常省动,在这里我引用下. 怎样理解阻塞非阻塞与同步异步的区别? 老张爱喝茶,废话不说,煮开水. 出场人物:老张,水壶两把(普通水壶,简称水壶:会响 ...
- 反爬虫:利用ASP.NET MVC的Filter和缓存(入坑出坑) C#中缓存的使用 C#操作redis WPF 控件库——可拖动选项卡的TabControl 【Bootstrap系列】详解Bootstrap-table AutoFac event 和delegate的分别 常见的异步方式async 和 await C# Task用法 c#源码的执行过程
反爬虫:利用ASP.NET MVC的Filter和缓存(入坑出坑) 背景介绍: 为了平衡社区成员的贡献和索取,一起帮引入了帮帮币.当用户积分(帮帮点)达到一定数额之后,就会“掉落”一定数量的“帮帮 ...
- Ext JS学习第十六天 事件机制event(一) DotNet进阶系列(持续更新) 第一节:.Net版基于WebSocket的聊天室样例 第十五节:深入理解async和await的作用及各种适用场景和用法 第十五节:深入理解async和await的作用及各种适用场景和用法 前端自动化准备和详细配置(NVM、NPM/CNPM、NodeJs、NRM、WebPack、Gulp/Grunt、G
code&monkey Ext JS学习第十六天 事件机制event(一) 此文用来记录学习笔记: 休息了好几天,从今天开始继续保持更新,鞭策自己学习 今天我们来说一说什么是事件,对于事件 ...
随机推荐
- Android多线程的使用
The speed and efficiency of a long-running, data-intensive operation often improves when you split i ...
- (文件操作)Android相关的File文件操作
判断文件是否存在: /** * 判断文件是否存在 * * @param path 文件路径 * @return [参数说明] * @return boolean [返回类型说明] */ public ...
- ssh com.jcraft.jsch.JSchException: Algorithm negotiation fail报错问题解决
我司自动安装部署工具ideploy,使用ssh连接主机并部署业务.今天提供给一线安装规划后,安装报错,测试连接主机失败,而直接使用ssh是可以连接上主机的.查看问题错误堆栈如下: ERROR pool ...
- python 函数递归与匿名函数
1.什么是函数递归? 函数递归调用(是一种特殊的嵌套调用):在调用的函数过程中,又直接或者间接的调用了该函数本身 递归必须要有两个明确的阶段: 递推:一层一层递归调用下去,强调每进入下一层递归问题的规 ...
- oracle数据库实例,数据库的理解
转自http://www.cnblogs.com/advocate/archive/2010/08/20/1804066.html 加深一下理解 数据库就是一个相片底片 实例就是相纸 一个底片可以冲多 ...
- ES6 Set 和 Map
ES5 模拟Set 与 Map 集合 Set 常用于检查对象中是否存在某个键名 Map集合常被用于获取已存的信息 所有对象的属性名必须是字符串,那么必须确保每个键名都是字符串类型且在对象中是唯一的 数 ...
- 如何提高sql查询速度
1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索 ...
- Hibernate简答题
简单题目 1.持久化对象的三种状态,代表含义. 自由状态(transient): 不曾进行持久化,未与任何Session相关联 持久化状态(persistent): 仅与一个Session相关联 游离 ...
- 初识hibernate——环境搭建
一 配置过程 1. 创建一个项目 2. 导包 required里的包 optional里的c3p0连接池的三个包 数据库驱动包 Junit 3.创建Hibernate的配置文件(hiberna ...
- Hadoop2之NameNode HA详解
在Hadoop1中NameNode存在一个单点故障问题,如果NameNode所在的机器发生故障,整个集群就将不可用(Hadoop1中虽然有个SecorndaryNameNode,但是它并不是NameN ...