我最近被问到一个关于.NET WebAPI的面试问题,它是这样的......
访问者:
向不执行任何异步操作的 WebAPI 控制器操作的方法签名添加
async
有什么好处吗?
我的回答:
否,因为该方法中没有阻塞代码,这意味着控制器操作应从线程池在其自己的线程中同步运行。这是对的吗?
访问者:
不,实际上不是。
我在网上搜索了大约 15-20 分钟以找到结论性的答案,但对答案并不完全满意......那么,我是对的还是面试官是对的?
进一步澄清这个问题:在这种情况下,负载测试 WebAPI 控制器操作是否会在负载下表现更好,因为它在签名中有一个异步关键字,即使它没有异步代码?
async
修饰符本身不执行任何操作。
从文档中:
如果
async
关键字修改的方法不包含await
表达式或语句,则该方法将同步执行。编译器警告会提醒您不包含await
语句的任何async
方法,因为这种情况可能表示错误。
你是对的,async
没有await
,将是一个在当前线程(不是新线程(上运行的Task
,直到最后基本上=同步运行。
如果您真的想考虑所有内容,那么将其标记为异步会增加创建Task
的完全可忽略的开销