c# - 什么时候使用 await async 不好?
问题描述
我有一个使用 C# 编写的基于 ASP.NET Core 3.1 的项目。我知道使用的最佳时间await
是async
访问外部资源,例如从数据库中提取数据、访问文件或发出 HTTP 请求。这释放了线程,因此可以完成更多工作,而不是让线程坐在那里等待代码完成。
但是,我想弄清楚在什么时候使用async/await
会损害性能?调用时释放线程await
并在任务完成时检索线程的过程是否有成本?
接下来找到的代码被异步调用。实际上,不需要异步调用该代码,因为所有代码都在内存中执行,并且没有发出外部请求。
public interface ILocator
{
Task<Model> ExampleAsync();
}
public class Example : Controller
{
public ILocator Locator { get; set; }
public Example(ILocator locator)
{
Locator = locator;
}
public async Task<IActionResult> Example()
{
Model model = await Locator.ExampleAsync();
return View(model);
}
}
public class Locator : ILocator
{
pubilc Task ExampleAsync()
{
Example model = new Example();
model.Status = "New";
return Task.CompletedTask;
}
}
这是上面代码的同步版本
public interface ILocator
{
Model Example();
}
public class Example : Controller
{
public ILocator Locator { get; set; }
public Example(ILocator locator)
{
Locator = locator;
}
public IActionResult Example()
{
Model model = Locator.Example();
return View(model);
}
}
public class Locator : ILocator
{
pubilc Example()
{
Example model = new Example();
model.Status = "New";
}
}
代码的异步版本是否会因为不必要的await/async
使用而比同步版本具有更高的成本/更低的性能?
什么时候async/await
弊大于利?
解决方案
您通常async/await
在执行 I/O 绑定任务时使用,例如从流中读取、从 DB 中读取、通过网络发送内容或等待响应。
这使得线程可用于执行其他一些(与 CPU 相关的工作)。
从技术上讲,async/await 在原始性能方面较慢,但是,它增加了应用程序的可伸缩性,因为它允许线程可用于其他工作,而其他线程正在等待 I/O 绑定操作。
推荐阅读
- google-apps-script - 在 Apps 脚本中获取完整的浏览器 URL
- three.js - 在three.js中实现冒名顶替者
- python - 如何通过 Selenium ActionChain 和 Python 点击元素
- python - 获取卷积算法失败。这可能是因为 cuDNN 初始化失败,
- javascript - JS 没有在加载了 .load 的页面上执行
- ios - 如何在不连接计算机的情况下将 Xcode 部署到多个设备
- sql - 跨适当间隔的总和持续时间
- batch-file - 之后立即再次运行批处理脚本时出错
- python - Python 3-从选择选项返回递归值和
- html - 需要对角分割mat表格单元格并添加值