如果全部都写成async await 能有什么好处呢,我测试实际上这个反而会等待await,下面的代码await 去掉会比加上执行更快 ,就比如这个接口发邮件, 去掉await可以不用等待直接返回。
[HttpGet("values")]
public async Task<int> Get()
{
System.Diagnostics.Debug.WriteLine("start");
await SendMailAsync();
System.Diagnostics.Debug.WriteLine("start2");
return 1;
}
public async Task SendMailAsync()
{
await Task.Run(() =>
{
//发邮件
Thread.Sleep(5000);
});
System.Diagnostics.Debug.WriteLine("start1");
}
await 就是等待此处完成。去掉了就是不用等待,会有后台线程自行完成的。
await 是释放当前线程,异步执行完成后从线程池中取一个线程继续执行
取的线程和 释放的线程有什么区别吗,这样有什么好处,如果全都是async 会更好?
@narojay: 本质上是多线程技术。不会阻塞主线程,提高程序响应。但创建新线程会花费系统资源,参考 https://blog.walterlv.com/post/task-wait-may-cause-long-time-waiting.html。
一般在IO耗时比较长代码使用多线程。
@geass..: web 请求的线程 和 异步使用的线程有什么区别 还有没有回答。
@narojay: 请求的线程 是iis主线程。异步线程是 后台线程或者 非iis线程。如果在非iis线程 使用httpcontext 会拿不到对象
参考 https://blog.csdn.net/weixin_33690367/article/details/86334746
首先不是必须的。
但是如果你打算 功能模块代码比如 数据存储、service服务, 采用 async await 模式,那么建议 这种模式 就要从 “底层一直用到 顶层”,不然在web/api项目中会出现死锁问题。这个可以自行百度下 async await 死锁问题。
图中代码
await 表示执行到这里,堵塞等待执行返回结果。如果你不加await 表示 异步执行,不关心执行结果
代码可以改成
var tast=SendMailAsync(); //这里 对task 可以作很多线程级别的处理。
//。。。
return await Task.FromResult(1) //async await 必须成对 使用
像🐟🐟 说的,这个还是去了解基础再用。总的来说
客户端比如winform的异步编程是解决界面卡顿的问题。
服务端的异步是解决并发请求导致等待的问题,能支持更多的并发请求。