标签:逻辑 read 需要 方法 内容 string 用户 请求 footer
void PagePaint() { Console.WriteLine("Paint Start"); Paint(); Console.WriteLine("Paint End"); } void Paint() { Rendering("Header"); Rendering(RequestBody()); Rendering("Footer"); } string RequestBody() { Thread.Sleep(1000); 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(1000); 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(1000); return "Ads"; }); Rendering(ads); }
这样的运行结果就算令人满意了:
Paint Start
Header
Paint End
Ads
Body
Footer
标签:逻辑 read 需要 方法 内容 string 用户 请求 footer
原文地址:https://www.cnblogs.com/bile/p/9470025.html