void PagePaint()
{
Console.WriteLine("Paint Start");
Paint();
Console.WriteLine("Paint End");
} void Paint()
{
Rendering("Header");
Rendering(RequestBody());
Rendering("Footer");
} string RequestBody()
{
Thread.Sleep();
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();
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();
return "Ads";
});
Rendering(ads);
}

这样的运行结果就算令人满意了:

Paint Start
Header
Paint End
Ads
Body
Footer

总结:

1.Paint()加async表示是可异步的,当里面有awit的时候,调用Paint的线程会异步处理Paint()后面的代码

2.Paint()里面是同步的,想要实现异步效果,再嵌套个加async的异步方法.

总之async 不加awit就是异步,加了就同步处理

实例测试:

   private  void button1_Click(object sender, EventArgs e)
{
textBox1.Text = "start\r\n";
aaa();//异步方法,如果里面有awits的时候启动异步,执行下一条代码=====>>"textBox1.Text += "dfgfdgdfdfg\r\n";"
textBox1.Text += "dfgfdgdfdfg\r\n";
} public async void aaa()
{
List<Task<PP>> plist = new List<Task<PP>>();
for (int i = ; i < ; i++)
{
Task<PP> p = Getp(i);
// p.Start();
plist.Add(p);
//PP p = await Getp(i);
//textBox1.Text +=p.Name + "\r\n";
}
textBox1.Text += "11111111111111111111\r\n";
while (plist.Count>)
{
try
{
Task<PP> imageTask = await Task.WhenAny(plist);
plist.Remove(imageTask); PP pppppp = await imageTask;
textBox1.Text += pppppp.Name + "\r\n"; }
catch (Exception exc) { MessageBox.Show(exc.Message); } }
textBox1.Text += "22222222222222222222\r\n";
}
public async Task<PP> Getp(int index)
{
PP p=new PP ();
switch (index)
{
case : Thread.Sleep();
p.Index=index;
p.Name=index.ToString();
return p; case :
return await Task.Run(() =>
{
Thread.Sleep();
p.Index = index;
p.Name = index.ToString();
return p;
});
case :
return await Task.Run(() =>
{
Thread.Sleep();
p.Index = index;
p.Name = index.ToString();
return p;
});
case :
return await Task.Run(() =>
{
Thread.Sleep();
p.Index = index;
p.Name = index.ToString();
return p;
});
default:
return await Task.Run(() =>
{
Thread.Sleep();
p.Index = index;
p.Name = index.ToString();
return p;
}); }
}

最新文章

  1. MYSQL limit,offset 区别
  2. Javascript之旅——终点站:困惑的settimeout
  3. js 日期处理,json处理
  4. markdown使用总结
  5. .Net魔法堂:史上最全的ActiveX开发教程——ActiveX与JS间交互篇
  6. 在Eclipse ee中成功使用jQuery UI插件
  7. Java Web编程的主要组件技术——Hibernate入门
  8. css 横向渐变 图片阴影效果 字体模糊效果
  9. linux 中用python实现终端命令行命令
  10. webpack开发环境配置和生产环境配置
  11. Codeforces Round #538 (Div. 2) CTrailing Loves (or L&#39;oeufs?)
  12. oracle日期格式化
  13. 线程池ThreadPoolExecutor整理
  14. zabbix 检测icmp参数
  15. 删掉centos原有的openjdk并安装sun jdk
  16. List&lt;String&gt; 和 ArrayList&lt;String&gt;的区别(转载)
  17. FSCapture注册码
  18. Java 中 日期 时间 加减
  19. centos6 vps部署rails
  20. (数据科学学习手札22)主成分分析法在Python与R中的基本功能实现

热门文章

  1. AGC 007D.Shik and Game(DP)
  2. synchronized(){}同步代码块笔记(新手笔记,欢迎纠正)
  3. 高质量PHP代码的50个实用技巧:非常值得收藏
  4. LOJ #10084. 「一本通 3.3 练习 1」最小圈(二分+SPFA判负环)
  5. 一个label两种颜色,一个label两种字体
  6. 用python实现ARP欺骗
  7. C#_02.13_基础四_.NET方法
  8. 如何移除HTML5 input在type=&quot;number&quot;时的上下小箭头
  9. 1、mysql初识
  10. CentOS 7配置成网关服务器