c# async和await 用法(阻塞与不阻塞)
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;
}); }
}
c# async和await 用法(阻塞与不阻塞)的更多相关文章
- async和await用法
原文:async和await用法 要理解async和await的用法,首先要了解Task相关知识,这里不做说明,因为这不是本文的重点. 如果你已经对Task很了解,那么如何使用async和await, ...
- async和await用法(Task)
原文:async和await用法 要理解async和await的用法,首先要了解Task相关知识,这里不做说明,因为这不是本文的重点. 如果你已经对Task很了解,那么如何使用async和await, ...
- Thread&ThreadPool、Parallel、Async和Await用法总结
1.线程和线程池Thread&ThreadPool //线程初始化时执行方法可以带一个object参数,为了传入自定义参数,所以执行需单独调用用于传参. Console.WriteLine(& ...
- 浅谈async函数await用法
今天状态不太好,睡久了懵一天. 以前只是了解过async函数,并还没有很熟练的运用过,所以先开个坑吧,以后再结合实际来更新下,可能说的有些问题希望大家指出. async和await相信大家应该不陌生, ...
- C#中async和await用法
.net 4.5中新增了async和await这一对用于异步编程的关键字. async放在方法中存在await代码的方法中,await放在调用返回Task的方法前. class Class1 { pr ...
- C# Async与Await用法
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- 【C#复习总结】 Async 和 Await 的异步编程
谈到异步,必然要说下阻塞,在知乎上看到了网友举的例子非常省动,在这里我引用下. 怎样理解阻塞非阻塞与同步异步的区别? 老张爱喝茶,废话不说,煮开水. 出场人物:老张,水壶两把(普通水壶,简称水壶:会响 ...
- 反爬虫:利用ASP.NET MVC的Filter和缓存(入坑出坑) C#中缓存的使用 C#操作redis WPF 控件库——可拖动选项卡的TabControl 【Bootstrap系列】详解Bootstrap-table AutoFac event 和delegate的分别 常见的异步方式async 和 await C# Task用法 c#源码的执行过程
反爬虫:利用ASP.NET MVC的Filter和缓存(入坑出坑) 背景介绍: 为了平衡社区成员的贡献和索取,一起帮引入了帮帮币.当用户积分(帮帮点)达到一定数额之后,就会“掉落”一定数量的“帮帮 ...
- Ext JS学习第十六天 事件机制event(一) DotNet进阶系列(持续更新) 第一节:.Net版基于WebSocket的聊天室样例 第十五节:深入理解async和await的作用及各种适用场景和用法 第十五节:深入理解async和await的作用及各种适用场景和用法 前端自动化准备和详细配置(NVM、NPM/CNPM、NodeJs、NRM、WebPack、Gulp/Grunt、G
code&monkey Ext JS学习第十六天 事件机制event(一) 此文用来记录学习笔记: 休息了好几天,从今天开始继续保持更新,鞭策自己学习 今天我们来说一说什么是事件,对于事件 ...
随机推荐
- 从web到搭建ssm环境
1:我先建立了个web项目, (1)在pom.xml中添加了如下 <dependencies> <!-- Spring --> <depend ...
- Java 构造器 通过私有构造器强化不可实例化的能力
只有当类不包含显式的构造器时,编译器才会生成一个公有的.无参的缺省构造器.只要让一个类包含私有构造器,这个类就不能被实例化了.示例: // 工具类 public class UtilityClass ...
- 移动游戏ui设计(一)
游戏世界 游戏界面就是根据游戏特性,把必要的信息展现在游戏主界面,操控界面和弹出界面上,通过合理的设计引导用户进行人机交互操作: 1, 游戏界面设计原则:交互设计尽量不要繁琐,用最简单的方式引导用户即 ...
- js 操作数组
数组的增删 数组的尾部插入一个元素 var nums = [0,1,2,3,4]; nums.push(5,6,6); //[0,1,2,3,4,5,6,6] 删除数组尾部的元素 var nums = ...
- gravity 和 layout_gravity
gravity : 是控件内部的内容的对齐方式. layout_gravity: 是控件相对于其容器的对齐方式. 如果 LinearLayout 的 android:orientation=&qu ...
- Sublime_SublimeServer
1. 遇到问题:如下代码第17行,获取本地json文件,如果直接在浏览器中打开引用该文件的.html文件,在chrme浏览器中并不能读取到json文件. var vm=new Vue({ el:&qu ...
- poj1064 Cable master(二分查找,精度)
https://vjudge.net/problem/POJ-1064 二分就相当于不停地折半试. C++AC,G++WA不知为何,有人说C函数ans那里爆int了,改了之后也没什么用. #inclu ...
- fzu1050 Number lengths(对数公式)
http://acm.fzu.edu.cn/problem.php?pid=1050 cmath头文件里有两种对数log()和log10(),一个是自然对数,一个是以10为底, 求n!的位数,根据对数 ...
- 1、mysql初识
之前我们写代码需要存取信息时用的是文件可是用文件存取数据非常局限,今天我们将走进一个新的世界mysql 本片导航: 数据库由来 数据库概述 mysql介绍 下载安装 mysql软件基本管理 初识sql ...
- Linux配置防火墙,开启80端口、3306端口
Linux配置防火墙,开启80端口.3306端口 起因是因为想使用Navicat连接一下数据库,发现连接不上 通过查阅许多资料和多次测试发现是因为防火墙没有配置3306端口 话不多说,开整,同理, ...