c# async和await 用法(阻塞与不阻塞)

2021-03-26 05:26

阅读:643

标签:阻塞   分享图片   his   ade   header   star   就是   logs   延时   

看示例吧:

技术分享图片
 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

挺正常的结果,但是Header渲染完以后页面就阻塞了,这个时候用户没法对Header进行操作。
于是就进行这样的修正:

技术分享图片
 1 async void Paint()
 2 {
 3     Rendering("Header");
 4     Rendering(await RequestBody());
 5     Rendering("Footer");
 6 }
 7 
 8 async Task RequestBody()
 9 {
10     return await Task.Run(() =>
11     {
12         Thread.Sleep(1000);
13         return "Body";
14     });
15 }
技术分享图片

运行结果变成了这样:

Paint Start
Header
Paint End
Body
Footer

这样就能在Header出现之后不阻塞主线程了。

不过呢,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 用法(阻塞与不阻塞)

标签:阻塞   分享图片   his   ade   header   star   就是   logs   延时   

原文地址:https://www.cnblogs.com/bile/p/9389813.html


评论


亲,登录后才可以留言!