c# async和await 用法(阻塞与不阻塞)
2021-03-26 05:26
标签:阻塞 分享图片 his ade header star 就是 logs 延时 看示例吧: 假设有这么个页面布局的方法,依次对头部、主体和底部进行渲染,头部和底部是固定的内容,而主体需要额外请求。 挺正常的结果,但是Header渲染完以后页面就阻塞了,这个时候用户没法对Header进行操作。 运行结果变成了这样: 这样就能在Header出现之后不阻塞主线程了。 出现了很严重的问题,头部都得等广告加载好了才能渲染,这样显然是不对的。 这样的运行结果就算令人满意了: c# async和await 用法(阻塞与不阻塞) 标签:阻塞 分享图片 his ade header star 就是 logs 延时 原文地址:https://www.cnblogs.com/bile/p/9389813.html 1 void PagePaint()
2 {
3 Console.WriteLine("Paint Start");
4 Paint();
5 Console.WriteLine("Paint End");
6 }
7
8 void Paint()
9 {
10 Rendering("Header");
11 Rendering(RequestBody());
12 Rendering("Footer");
13 }
14
15 string RequestBody()
16 {
17 Thread.Sleep(1000);
18 return "Body";
19 }
这里用Sleep模拟网络延时,Rendering方法其实也就是对Console.WriteLine的简单封装而已。。。
PagePaint运行过后,结果是这样的:Paint Start
Header
Body
Footer
Paint End
于是就进行这样的修正: 1 async void Paint()
2 {
3 Rendering("Header");
4 Rendering(await RequestBody());
5 Rendering("Footer");
6 }
7
8 async Task
Paint Start
Header
Paint End
Body
Footer
不过呢,Footer一直都得等到Body渲染完成后才能被渲染,这个逻辑现在看来还没问题,因为底部要相对于主体进行布局。
然而我这时候又想给页面加一个广告,而且是fixed定位的那种,管啥头部主体想盖住就盖住,你们在哪它不管。
比如这样写:1 async void Paint()
2 {
3 Rendering(await RequestAds());
4 Rendering("Header");
5 Rendering(await RequestBody());
6 Rendering("Footer");
7 }
所以应该改成这样: 1 async void Paint()
2 {
3 PaintAds();
4 Rendering("Header");
5 Rendering(await RequestBody());
6 Rendering("Footer");
7 }
8
9 async void PaintAds()
10 {
11 string ads = await Task.Run(() =>
12 {
13 Thread.Sleep(1000);
14 return "Ads";
15 });
16 Rendering(ads);
17 }
Paint Start
Header
Paint End
Ads
Body
Footer
文章标题:c# async和await 用法(阻塞与不阻塞)
文章链接:http://soscw.com/index.php/essay/68062.html