首页 新闻 会员 周边

对于.net core webapi 必须 每个controller方法都要写成async的吗

1
悬赏园豆:50 [待解决问题]

如果全部都写成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");
        }
narojay的主页 narojay | 初学一级 | 园豆:3
提问于:2019-11-28 22:46
< >
分享
所有回答(5)
0

await 就是等待此处完成。去掉了就是不用等待,会有后台线程自行完成的。

通信的搞程序 | 园豆:1747 (小虾三级) | 2019-11-29 08:19
0

await 是释放当前线程,异步执行完成后从线程池中取一个线程继续执行

geass.. | 园豆:1821 (小虾三级) | 2019-11-29 09:03

取的线程和 释放的线程有什么区别吗,这样有什么好处,如果全都是async 会更好?

支持(0) 反对(0) narojay | 园豆:3 (初学一级) | 2019-11-29 10:41

@narojay: 本质上是多线程技术。不会阻塞主线程,提高程序响应。但创建新线程会花费系统资源,参考 https://blog.walterlv.com/post/task-wait-may-cause-long-time-waiting.html。
一般在IO耗时比较长代码使用多线程。

支持(0) 反对(0) geass.. | 园豆:1821 (小虾三级) | 2019-11-29 14:18

@geass..: web 请求的线程 和 异步使用的线程有什么区别 还有没有回答。

支持(0) 反对(0) narojay | 园豆:3 (初学一级) | 2019-12-04 14:17

@narojay: 请求的线程 是iis主线程。异步线程是 后台线程或者 非iis线程。如果在非iis线程 使用httpcontext 会拿不到对象

参考 https://blog.csdn.net/weixin_33690367/article/details/86334746

支持(0) 反对(1) geass.. | 园豆:1821 (小虾三级) | 2019-12-04 17:31
0

首先不是必须的。
但是如果你打算 功能模块代码比如 数据存储、service服务, 采用 async await 模式,那么建议 这种模式 就要从 “底层一直用到 顶层”,不然在web/api项目中会出现死锁问题。这个可以自行百度下 async await 死锁问题。

图中代码
await 表示执行到这里,堵塞等待执行返回结果。如果你不加await 表示 异步执行,不关心执行结果
代码可以改成
var tast=SendMailAsync(); //这里 对task 可以作很多线程级别的处理。
//。。。
return await Task.FromResult(1) //async await 必须成对 使用

gt1987 | 园豆:1150 (小虾三级) | 2019-12-02 11:02
0

不是每个Controller都要用async/await的!但是我认为使用async/await可以提高服务器的利用率。

建议您了解下C#中的异步编程。其中您需要重点看TAP模式

如果您的Action中没有用到异步方法,那您就可以不用async修饰。

如果您的Action中用到了异步方法,那建议您使用async/await修饰。具体看这篇异步编程的最佳实践

&#128031;&#128031; | 园豆:218 (菜鸟二级) | 2019-12-04 09:37
0

像🐟🐟 说的,这个还是去了解基础再用。总的来说

客户端比如winform的异步编程是解决界面卡顿的问题。
服务端的异步是解决并发请求导致等待的问题,能支持更多的并发请求。

变形精怪 | 园豆:5 (初学一级) | 2020-01-16 16:52
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册