看示例吧:
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<string> 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
原文地址:https://www.cnblogs.com/bile/p/9389813.html
时间: 2024-10-11 21:10:46