c# async和await 用法(阻塞与不阻塞)
2021-03-23 06:23
标签:逻辑 read 需要 方法 内容 string 用户 请求 footer 假设有这么个页面布局的方法,依次对头部、主体和底部进行渲染,头部和底部是固定的内容,而主体需要额外请求。 挺正常的结果,但是Header渲染完以后页面就阻塞了,这个时候用户没法对Header进行操作。 运行结果变成了这样: 这样就能在Header出现之后不阻塞主线程了。 出现了很严重的问题,头部都得等广告加载好了才能渲染,这样显然是不对的。 这样的运行结果就算令人满意了: c# async和await 用法(阻塞与不阻塞) 标签:逻辑 read 需要 方法 内容 string 用户 请求 footer 原文地址:https://www.cnblogs.com/bile/p/9470025.htmlvoid 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
于是就进行这样的修正:async void Paint()
{
Rendering("Header");
Rendering(await RequestBody());
Rendering("Footer");
}
async Taskstring> RequestBody()
{
return await Task.Run(() =>
{
Thread.Sleep(1000);
return "Body";
});
}
Paint Start
Header
Paint End
Body
Footer
不过呢,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
下一篇:C#判断字符串中是否有数字