c# - 使 Controller 方法异步会提高其性能吗?有什么好处?

标签 c# rest asynchronous api-design

免责声明:我已经仔细考虑过这个问题是否是基于意见的,因为我明白遵守网站规则的重要性。我的结论是它足够具体,可以在这里回答。如果我接受纠正,我深表歉意。

我选择在没有asyncTask 的情况下编写我的 Controller 。我认为,由于两个原因,异步操作没有任何好处。

  1. 整个 View 模型是一次性提供的,在整个内容准备好呈现之前,没有任何有意义的信息可以呈现(即没有列表被逐渐传输)。

  2. 服务中的操作需要进行一些繁重的数据处理,并且基于假设了解所有检索到的元素并在公开之前存储某些信息的逻辑(即没有SaveChangesAsync() 等是可能的,并且使用 AsNoTracking() 是存在的)。

描述 View 模型的类大致如下所示。

public class TheViewModel
{
  public string Name { get; set; }
  public byte[] Pieces { get; set; }
  public Guid Id { get; set; }
  public Dictionary<int, Info> { get; set; }
}

public class Info
{
  public Guid Id { get; set; }
  public Guid ParentLeftId { get; set; }
  public Guid ParentRightId { get; set; }
  public Guid ParentRandId { get; set; }
  public int[] Data { get; set; }
  public List<DateTime> { get; set; }
}

我的一位同事对我的选择做出了 react ,并争辩说:

一个。这不是推荐的方式, b.该操作将执行效率较低, C。这违反了最佳实践。

我们用谷歌搜索并阅读了很多博客。总体印象表明该论点是有效的。但是,我质疑它在我们案例中的相关性。 Prestanda 不是一个民主问题,不能以意见为基础。

当我试图查找实际引用资料(MSDN、SO 等)时,其中说明究竟如何性能会受到影响,但我一无所获。我也没有找到太多关于如何可靠地测试它的信息。

最佳答案

The whole view model is served at once and there's no meaningful information to present until the whole content is ready to be rendered

这实际上不是问题所在。

您可能在某处从数据库获取信息(您提到了保存更改。)如果您与数据库进行异步交互(例如 ExecuteDataReaderAsync),则等待它意味着查询正在执行执行执行查询的线程可以做其他事情。当查询完成执行时,该线程(或另一个无关紧要的线程)将结束。

允许线程在查询时执行其他操作,而不是只等待,这样可以提高应用程序的性能。

这就是我认为困惑的来源:async/await 如何使您的 Controller 方法执行得更快? 它没有。一点也不。事实上,让一个线程在像这样的任务之间切换可能会使它稍微慢一点。 (这通常是微不足道的,你不应该担心它。)

但总体而言,您的应用程序的性能可以更快,因为无论有多少线程可用 - 即使只有一个 - 它们有可能正在做某事而不是等待。

您正在做的个别事情(比如执行 Controller 方法)并没有更快,但是您让您的应用程序有机会利用它拥有的每个线程做更多事情。无论花费多长时间,它都可能会更快开始,因为它不等待线程,这意味着它完成更快,而不是更快。

即使您的应用程序一次收到一个请求并仅使用一个线程处理它,这里有一个场景:如果您发出两个数据库或 API 请求,而两个请求都不依赖于另一个的结果怎么办?如果您同步处理它们,您将等待一个完成,开始下一个,然后等待下一个完成。如果您异步处理它们,则启动一个,在等待期间可以启动下一个。两项单独的任务都不会发生得更快。不同之处在于第二个任务开始得更快 - 而与第一个任务无关,只能等待。

因此,当我们谈论“线程”时,它并不是真正的多线程。这是关于如何使用每个单独的线程。

关于c# - 使 Controller 方法异步会提高其性能吗?有什么好处?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55967063/

相关文章:

c# - 如何防止 for 循环中覆盖数组条目?

Python Bottle 休息 header 不适用于下划线

javascript - Yepnope 回调始终返回 'result = false'

c# - MediaElement 似乎在播放视频时禁用锁定屏幕

c# - 在 aspx 中,当在文本框上按下 "Enter"时如何触发按钮单击事件,而源 cs 文件中定义的按钮单击事件

c# - 在 WPF 中,如何在代码隐藏中引用资源库中的字体?

java - CRest日志请求/响应体

c# - 使用 content(body) 或多个参数的 restful API get 方法

javascript - 当你发出并行请求时 libuv 中发生了什么

c# - 回绕速率限制 API 调用