杨中科 .NETCORE 异步编程

一、 为什么需要异步编程

异步点餐的优点:能同时服务多个客人

异步点餐一定会提升单个客户点餐速度吗?
答案理所当然:不能

图片美化服务例子服务器能够同时服务的请求数量有限

void BeautifyPic (File photo, Response response)
{
	byte[] bytes = 美化图片(photo);
	response.Write(bytes):
}

杨中科 .NETCORE 异步编程_第1张图片
处理完成后再回调,异步回调通知的。就可以同时处理更多的请求

传统多线程开发太麻烦。C#关键字;
async、await。async、await不等于“多线程

二、async await 基本使用

“异步方法”:用async关键字修饰的方法
1、异步方法的返回值一般是Task,T是真正的返回值类型,Task。惯例: 异步方法名字以Async结尾。
2、即使方法没有返回值,也最好把返回值声明为非泛型的Task。
3、调用泛型方法时,一般在方法前加上await关,这样拿到的返回值就是泛型指定的T类型
4、异步方法的“传染性”:一个方法中如果有await调用,则这个方法也必须修饰为async(其他都是同步方法,只要有一句异步,这个方法就必须修饰未async)

static async Task Main(string[] args)
{
   string fileName = "d:/1.txt"File.Delete(fileName);
   File.WriteAllTextAsync(fileName, "hello async");
   string 	s = await File.ReadAllTextAsync(fileName);
   Console.Writeline(s);
}

试一试异步

新建控制台应用

杨中科 .NETCORE 异步编程_第2张图片
杨中科 .NETCORE 异步编程_第3张图片

同步方式

杨中科 .NETCORE 异步编程_第4张图片

运行结果:

杨中科 .NETCORE 异步编程_第5张图片

异步方式

此时主方法需要改为

杨中科 .NETCORE 异步编程_第6张图片
杨中科 .NETCORE 异步编程_第7张图片

若去掉await

杨中科 .NETCORE 异步编程_第8张图片

此时文件 也能生成(留下疑问)

杨中科 .NETCORE 异步编程_第9张图片

读取的两种方式 ,第一种会自动转换(是第二种的两句合并)
杨中科 .NETCORE 异步编程_第10张图片
不加await 运行效果 是因为 写入hello 字符得速度很快
尝试加入 大字符
杨中科 .NETCORE 异步编程_第11张图片

运行
杨中科 .NETCORE 异步编程_第12张图片

WriteAllTextAsync == 独占式写入==,正在写的途中是不能 读出数据
不写await 是启动写入后,不等写完 就继续执行下面的语句

因为第二行代码是异步,可能会先于第一行执行,要么都异步,要么都同步

加入await之后:
杨中科 .NETCORE 异步编程_第13张图片

运行结果:
杨中科 .NETCORE 异步编程_第14张图片

三、编写异步方法

不带返回值

杨中科 .NETCORE 异步编程_第15张图片

运行:

杨中科 .NETCORE 异步编程_第16张图片

查看文件:
杨中科 .NETCORE 异步编程_第17张图片

带返回值

杨中科 .NETCORE 异步编程_第18张图片
杨中科 .NETCORE 异步编程_第19张图片

运行结果:

杨中科 .NETCORE 异步编程_第20张图片

【注意】
如果同样的功能,既有同步方法,又有异步方法,那么首先使用异步方法。 .NET5中,很多框架中的方法也都支持异步:Main、WinForm事件处理函数。

对于不支持的异步方法怎么办? Wait()(无返回值);Rest(有返回值)。
风险:死锁。尽量不用

winform中 异步方法得使用

同步方式

杨中科 .NETCORE 异步编程_第21张图片

运行结果:
杨中科 .NETCORE 异步编程_第22张图片

异步方式

杨中科 .NETCORE 异步编程_第23张图片
运行结果:
会报错,winform 委托函数已经规定了 返回值必须是void

修改会void
杨中科 .NETCORE 异步编程_第24张图片
运行结果
杨中科 .NETCORE 异步编程_第25张图片

对于不支持异步得情况

假如说 只能调用异步的方法,Main 又不支持异步

result 方式

杨中科 .NETCORE 异步编程_第26张图片

运行结果:
杨中科 .NETCORE 异步编程_第27张图片

await会暂时退出当前函数,result是阻塞当前线程

wait 方式

杨中科 .NETCORE 异步编程_第28张图片
运行结果:
杨中科 .NETCORE 异步编程_第29张图片

异步委托

ThreadPool.QueueUserWorkItem(async(obj) => {
await SomeAsync();
});

测试

杨中科 .NETCORE 异步编程_第30张图片

运行:

杨中科 .NETCORE 异步编程_第31张图片

异步方式

杨中科 .NETCORE 异步编程_第32张图片

修改:异步的
杨中科 .NETCORE 异步编程_第33张图片

运行结果:
杨中科 .NETCORE 异步编程_第34张图片

你可能感兴趣的:(ASP.NET,.netcore)